kingkont 0.10.0 → 0.10.1

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.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
package/renderer/board.js CHANGED
@@ -949,6 +949,9 @@ async function closeProject() {
949
949
  // Помечаем что юзер вышел явно — на следующем старте autoload пропускается.
950
950
  // Cmd+R после close = welcome, а не реоткрытие.
951
951
  try { localStorage.setItem('welcomeOnNextStart', '1'); } catch {}
952
+ // Чат привязан к одному проекту — чистим историю при выходе чтобы
953
+ // не путал контекст следующего открытого проекта.
954
+ if (window.kingChat?.clear) window.kingChat.clear();
952
955
  stopExternalWatcher();
953
956
  // Сбрасываем UI таймлайна/превью — иначе при возврате через welcome
954
957
  // в новый проект остаётся фрейм/дорожки прошлого.
@@ -196,7 +196,46 @@
196
196
  async function openCloudProject(projectId, suggestedName, opts = {}) {
197
197
  const s = await getSettings();
198
198
  if (!isLoggedIn(s)) { alert('Войдите в KingKont'); return; }
199
- // 1. Проверяем синхронизирован ли уже локально.
199
+
200
+ // 0. Если этот cloud-проект ранее был сохранён ИЗ папочного — открываем
201
+ // оригинальную папку (с уже скачанными файлами) и не качаем ничего.
202
+ // Mapping cloudFolder:<projectId> → folderName ставит saveCloudProject.
203
+ // Папка должна быть granted в FSAH (юзер раз дал — handle живёт в IDB).
204
+ if (!opts.forceRefresh) {
205
+ try {
206
+ const folderName = await idbGet(`cloudFolder:${projectId}`);
207
+ if (folderName) {
208
+ const folderHandle = await idbGet(`handle:${folderName}`);
209
+ if (folderHandle) {
210
+ // Verify permission still granted (без user-gesture не запрашиваем).
211
+ let g = 'prompt';
212
+ try { g = await folderHandle.queryPermission({ mode: 'readwrite' }); } catch {}
213
+ if (g === 'granted') {
214
+ // Дополнительно проверим что в папке лежит meta с тем же cloudProjectId
215
+ // (юзер мог перенести/изменить — тогда fallback на download).
216
+ try {
217
+ const metaFh = await folderHandle.getFileHandle('.kingkont-meta.json');
218
+ const metaTxt = await (await metaFh.getFile()).text();
219
+ const meta = JSON.parse(metaTxt);
220
+ if (meta.cloudProjectId === projectId) {
221
+ state.cloudProjectId = projectId;
222
+ state.cloudDirty = false;
223
+ touchCloudOpened(projectId);
224
+ await openFilm(folderHandle);
225
+ setCloudButtonsVisibility();
226
+ return;
227
+ }
228
+ } catch {}
229
+ // Permission granted но meta не совпала — обнуляем mapping
230
+ // (idbSet(null) — простой способ без отдельного idbDel).
231
+ try { await idbSet(`cloudFolder:${projectId}`, null); } catch {}
232
+ }
233
+ }
234
+ }
235
+ } catch {}
236
+ }
237
+
238
+ // 1. Проверяем синхронизирован ли уже в userData/cloud-projects/<id>/.
200
239
  if (window.cloudFs) {
201
240
  try {
202
241
  const metaText = await window.cloudFs.readText(projectId, '.kingkont-meta.json');
@@ -489,6 +528,22 @@
489
528
  });
490
529
  }
491
530
 
531
+ // 5) Если это ПАПОЧНЫЙ проект (не cloud-shim), запоминаем mapping
532
+ // cloudProjectId → folderName в IDB. Когда юзер позже откроет
533
+ // этот же cloud-проект из welcome, openCloudProject подхватит
534
+ // оригинальную папку (с уже скачанными файлами) и НЕ будет
535
+ // качать всё заново. Mapping живёт в той же IDB-схеме что
536
+ // handle:<name>: cloudFolder:<projectId> = name.
537
+ if (!window.cloudFsShim?.isCloudHandle?.(state.filmHandle)) {
538
+ try {
539
+ await idbSet(`cloudFolder:${projectId}`, state.filmHandle.name);
540
+ // Также запоминаем cloudProjectId на текущей сессии — чтобы
541
+ // следующий save без перезахода не ловил «папочный → новый cloud».
542
+ state.cloudProjectId = projectId;
543
+ if (window.cloudProjects?.setVisibility) window.cloudProjects.setVisibility();
544
+ } catch {}
545
+ }
546
+
492
547
  PROGRESS.hide();
493
548
  markClean();
494
549
  const stats = reused