kingkont 0.20.64 → 0.20.66
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/index.html +8 -3
- package/package.json +1 -1
- package/renderer/generate.js +43 -2
package/index.html
CHANGED
|
@@ -45,9 +45,14 @@
|
|
|
45
45
|
<input id="sidebarSearch" type="text" placeholder="Поиск…" autocomplete="off">
|
|
46
46
|
</div>
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
<!-- Раздел «Персонажи» убран — он будет включён в «Ресурсы» (юзер: «убери
|
|
49
|
+
совсем раздел Персонажи. мы будем его включать в ресурсы»). #newCharacter
|
|
50
|
+
и #characterList оставлены как скрытые stub'ы, чтобы getElementById-
|
|
51
|
+
обращения из board.js (newCharacter listener, refreshCharacters →
|
|
52
|
+
characterList.innerHTML, addEventListener'ы) не падали. -->
|
|
53
|
+
<div style="display:none">
|
|
54
|
+
<button id="newCharacter"></button>
|
|
55
|
+
<div id="characterList"></div>
|
|
51
56
|
</div>
|
|
52
57
|
|
|
53
58
|
<div class="sidebar-section kk-edit-only">
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kingkont",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.66",
|
|
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/generate.js
CHANGED
|
@@ -541,7 +541,9 @@ $('textGenSubmit').addEventListener('click', async () => {
|
|
|
541
541
|
}
|
|
542
542
|
const imageRefs = allMediaRefs.filter(r => r.type === 'image' && r.file);
|
|
543
543
|
// Резолвим mentions: text-ноды → инлайн .md, image-ноды → маркеры [image N].
|
|
544
|
-
|
|
544
|
+
let resolvedPrompt = (typeof resolveMentions === 'function') ? resolveMentions(rawPrompt, imageRefs) : rawPrompt;
|
|
545
|
+
// Достраиваем описания референсов (имя + node.description).
|
|
546
|
+
resolvedPrompt = appendRefDescriptions(resolvedPrompt, imageRefs);
|
|
545
547
|
// Создаём ноду в pending-состоянии сразу — пока модель работает, на холсте
|
|
546
548
|
// виден spinner, юзер может закрыть модалку, ходить по проекту и т.д.
|
|
547
549
|
const dir = await getOrCreateBoardSubdir(state.currentBoard.handle, 'texts');
|
|
@@ -1288,6 +1290,33 @@ function _pendingConnectionFromRef() {
|
|
|
1288
1290
|
return refs;
|
|
1289
1291
|
}
|
|
1290
1292
|
|
|
1293
|
+
// Достроить к промпту описания референс-нод (имя + node.description).
|
|
1294
|
+
// Юзер: «когда мы грузим референсы и есть описание у ноды — добавляй и имя
|
|
1295
|
+
// ноды и описание в промпт». Помогает моделям понимать, что именно каждый
|
|
1296
|
+
// референс представляет: «@диван — серый угловой диван IKEA, 3 секции».
|
|
1297
|
+
// Описание ищется по ref.file в нодах ТЕКУЩЕЙ доски (refs из других досок
|
|
1298
|
+
// — sheet'ы персонажей/локаций — обычно сами по себе self-explanatory).
|
|
1299
|
+
function appendRefDescriptions(prompt, mediaRefs) {
|
|
1300
|
+
if (!Array.isArray(mediaRefs) || !mediaRefs.length) return prompt;
|
|
1301
|
+
const nodes = state.currentBoard?.metadata?.nodes || [];
|
|
1302
|
+
const lines = [];
|
|
1303
|
+
const seen = new Set();
|
|
1304
|
+
for (const ref of mediaRefs) {
|
|
1305
|
+
if (!ref || !ref.file) continue;
|
|
1306
|
+
if (seen.has(ref.file)) continue;
|
|
1307
|
+
seen.add(ref.file);
|
|
1308
|
+
const node = nodes.find(n => n.file === ref.file);
|
|
1309
|
+
if (!node) continue;
|
|
1310
|
+
const desc = (node.description || '').trim();
|
|
1311
|
+
if (!desc) continue;
|
|
1312
|
+
const name = (ref.name || node.name || '').trim();
|
|
1313
|
+
if (!name) continue;
|
|
1314
|
+
lines.push(`@${name}: ${desc}`);
|
|
1315
|
+
}
|
|
1316
|
+
if (!lines.length) return prompt;
|
|
1317
|
+
return (prompt || '').replace(/\s+$/, '') + '\n\nОписания референсов:\n' + lines.join('\n');
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1291
1320
|
// Собрать рефы из выбранных персонажей и локации (sheet'ы)
|
|
1292
1321
|
function gatherPickedSheetRefs() {
|
|
1293
1322
|
const refs = [];
|
|
@@ -2114,7 +2143,19 @@ async function startGenerationJob(node, kind, prompt, mediaRefs, boardHandle, bK
|
|
|
2114
2143
|
await mutateNode(bKey, boardHandle, node.id, n => {
|
|
2115
2144
|
n.generated = { ...(n.generated || {}), state: 'submitting' };
|
|
2116
2145
|
});
|
|
2117
|
-
|
|
2146
|
+
// Достраиваем к промпту описания референсов (имя + node.description).
|
|
2147
|
+
// Юзер: «когда мы грузим референсы и есть описание у ноды — добавляй и
|
|
2148
|
+
// имя ноды и описание в промпт». Делается ЗДЕСЬ (а не в genSubmit) чтобы
|
|
2149
|
+
// покрыть и resumeJob, и regenerateInto — все пути проходят через
|
|
2150
|
+
// startGenerationJob. Описания из node.description (image/video-нод
|
|
2151
|
+
// текущей доски) → блок «Описания референсов:\n@имя: текст».
|
|
2152
|
+
const enrichedPrompt = (typeof appendRefDescriptions === 'function')
|
|
2153
|
+
? appendRefDescriptions(prompt, mediaRefs)
|
|
2154
|
+
: prompt;
|
|
2155
|
+
if (enrichedPrompt !== prompt) {
|
|
2156
|
+
logJob(node.id, `enriched prompt with ${mediaRefs?.length || 0} refs descriptions`);
|
|
2157
|
+
}
|
|
2158
|
+
const submitBody = { kind, prompt: enrichedPrompt, imageInputs, videoInputs, model: modelKey };
|
|
2118
2159
|
// Приоритет aspectRatio:
|
|
2119
2160
|
// 1) node.generated.aspectRatio (если ноду уже генерили с этим)
|
|
2120
2161
|
// 2) state.currentBoard.metadata.settings.aspectRatio (доска-уровень)
|