kingkont 0.2.0

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/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # KingKont · Chatium
2
+
3
+ Локальный нод-редактор сцен с AI-генерацией (картинки, видео, голос, SFX,
4
+ музыка, текст). Каждая «сцена» — папка на диске с `scene.json`, файлы
5
+ лежат рядом, любой инструмент может читать их без редактора.
6
+
7
+ ## Быстрый старт
8
+
9
+ ```bash
10
+ npx kingkont
11
+ ```
12
+
13
+ Откроется Electron-приложение. На welcome-экране — большая кнопка
14
+ «Открыть проект»: выберешь любую папку, она и станет проектом.
15
+
16
+ ## Через браузер вместо Electron
17
+
18
+ ```bash
19
+ npx kingkont serve
20
+ ```
21
+
22
+ Поднимет HTTP-сервер на `http://localhost:17893` — открой в Chrome /
23
+ Edge / Brave (нужен File System Access API). Удобно для встраивания в
24
+ preview-окна, удалённых машин и т.п.
25
+
26
+ ## Что внутри проектной папки
27
+
28
+ ```
29
+ my-project/
30
+ ├── CLAUDE.md ← авто-создаётся при первом открытии,
31
+ │ описывает структуру для AI-агентов
32
+ ├── _characters/
33
+ ├── _locations/
34
+ ├── <сцена>/
35
+ │ ├── scene.json
36
+ │ ├── clips/ images/ audio/ texts/
37
+ └── _deleted/ ← корзина, Cmd+Z восстанавливает
38
+ ```
39
+
40
+ ## Ключи API
41
+
42
+ При первой попытке генерации редактор попросит API-ключи через `Cmd+,`:
43
+
44
+ - **KIE** (`api.kie.ai`) — для картинок и видео
45
+ - **ElevenLabs** (`elevenlabs.io`) — голос, SFX, музыка
46
+ - **OpenRouter** (`openrouter.ai`) — текст и vision
47
+
48
+ Хранятся в `~/Library/Application Support/KingKont/settings.json` (на
49
+ macOS) — переустановка приложения их не теряет.
50
+
51
+ ## Шорткаты
52
+
53
+ | Действие | macOS |
54
+ |---|---|
55
+ | Открыть проект | `Cmd+O` |
56
+ | Новая сцена | `Cmd+N` |
57
+ | Закрыть проект / окно | `Cmd+W` |
58
+ | Настройки | `Cmd+,` |
59
+ | Undo / Redo | `Cmd+Z` / `Cmd+Shift+Z` |
60
+ | Cut / Copy / Paste | `Cmd+X` / `Cmd+C` / `Cmd+V` |
61
+ | Esc | закрыть любую модалку |
62
+
63
+ ## Разработка
64
+
65
+ ```bash
66
+ git clone <repo>
67
+ cd kingkont
68
+ npm install
69
+ npm start # обычный dev-запуск Electron
70
+ npm run dist # собрать .dmg (mac) / .exe (win) / .AppImage (linux)
71
+ ```
@@ -0,0 +1,149 @@
1
+ # Структура проекта KingKont
2
+
3
+ Эта папка — **проект** (фильм/сериал) редактора **KingKont · Chatium**. Файлы здесь
4
+ создаются и редактируются GUI-приложением, но всё хранится в plain-формате —
5
+ любой инструмент (включая Claude Code) может читать/изменять напрямую.
6
+
7
+ ## Что лежит в корне
8
+
9
+ ```
10
+ .
11
+ ├── CLAUDE.md ← этот файл
12
+ ├── _characters/ ← персонажи
13
+ │ └── <имя>/ ← одна доска на персонажа
14
+ ├── _locations/ ← локации
15
+ │ └── <имя>/ ← одна доска на локацию
16
+ ├── <имя сцены>/ ← сцены лежат прямо в корне как папки
17
+ │ └── … ← (любое имя кроме начинающихся с `_` и `.`)
18
+ ├── _deleted/ ← корзина: удалённые файлы попадают сюда
19
+ │ (восстанавливаются через Cmd+Z в редакторе)
20
+ └── (любые другие файлы) ← редактор их не трогает
21
+ ```
22
+
23
+ ## Доска (board) — папка персонажа / локации / сцены
24
+
25
+ Любая доска внутри (`_characters/<имя>/`, `_locations/<имя>/`, `<сцена>/`)
26
+ имеет одинаковую структуру:
27
+
28
+ ```
29
+ <board>/
30
+ ├── scene.json ← вся метаинформация (см. ниже)
31
+ ├── clips/ ← видео-файлы (mp4, mov, webm…)
32
+ ├── images/ ← картинки (jpg, png, webp…)
33
+ ├── audio/ ← аудио (mp3, wav, m4a…)
34
+ └── texts/ ← .md-файлы текстовых нод
35
+ ```
36
+
37
+ ## Формат `scene.json`
38
+
39
+ Главный файл доски. Редактор читает его при открытии и пишет debounced при
40
+ любом изменении. Пример:
41
+
42
+ ```json
43
+ {
44
+ "nodes": [
45
+ {
46
+ "id": "uuid-here",
47
+ "type": "image" | "video" | "audio" | "text",
48
+ "name": "опциональное имя для @-ссылок",
49
+ "file": "images/foo.jpg", // относительный путь в папке доски
50
+ "x": 100, "y": 200, // позиция на холсте (логические px)
51
+ "width": 280, "height": 320, // опц., если юзер ресайзил ноду
52
+ "generated": { // опц., если нода создана генерацией
53
+ "kind": "image" | "video" | "audio" | "text",
54
+ "prompt": "финальный промпт после resolve mentions",
55
+ "rawPrompt": "исходный промпт с [@ref]",
56
+ "model": "nano-banana-2" | "bytedance/seedance-2" | "eleven_v3" | "anthropic/claude-sonnet-4" | …,
57
+ "modelKey": "ключ модели для KIE",
58
+ "voiceId": "...", // для audio
59
+ "tones": ["шепот", …], // для audio
60
+ "refs": [{name, type, file}],
61
+ "state": "submitting" | "queued" | "generating" | "success" | "error",
62
+ "taskId": "..."
63
+ },
64
+ "status": "generating" | "draft" | "error" | undefined,
65
+ "error": "текст ошибки если status=error",
66
+ "history": [...], // history правок (через ⇄ Заменить)
67
+ "historyIndex": 0
68
+ }
69
+ // ... text-нода: поле "text" в JSON НЕ хранится; контент лежит в texts/<file>.md
70
+ ],
71
+ "connections": [
72
+ { "from": "node-id", "to": "node-id" }
73
+ ],
74
+ "view": { "scrollLeft": 0, "scrollTop": 0, "zoom": 1.0 },
75
+ "character": { // только для досок-персонажей
76
+ "characterSheet": "images/sheet.jpg",
77
+ "voice": "elevenlabs-voice-id",
78
+ "tone": "по умолчанию",
79
+ "commonTones": ["шепот", "крик", …],
80
+ "lastTones": [],
81
+ "replicas": [...]
82
+ },
83
+ "location": { // только для досок-локаций
84
+ "sheet": "images/sheet.jpg"
85
+ },
86
+ "timeline": { // монтажный лист сцены
87
+ "tracks": [
88
+ {
89
+ "id": "tv", "name": "Видео", "kind": "video" | "audio",
90
+ "clips": [
91
+ {
92
+ "id": "uuid",
93
+ "nodeId": "node-id или null", // привязка к ноде на холсте
94
+ "type": "video" | "image" | "audio",
95
+ "file": "clips/foo.mp4",
96
+ "name": "Foo",
97
+ "duration": 5.0, // в секундах
98
+ "start": 0, // позиция начала на дорожке
99
+ "trimStart": 0, // обрезка спереди
100
+ "sourceDuration": 5.0, // полная длительность файла
101
+ "_durationLoaded": true,
102
+ "groupId": "...", // опц., группа клипов
103
+ "disabled": false // skip при playback
104
+ }
105
+ ]
106
+ }
107
+ ],
108
+ "playhead": 0.27
109
+ },
110
+ "history": { // undo/redo (Cmd+Z / Cmd+Shift+Z)
111
+ "past": [{ "ts": 1234567890, "label": "…", "snap": "JSON-string", "movedFiles": [...] }],
112
+ "future": [...]
113
+ }
114
+ }
115
+ ```
116
+
117
+ ## Текстовые ноды
118
+
119
+ Текст ноды хранится не в `scene.json`, а в `texts/<имя>.md`. Поле `node.file`
120
+ указывает путь, поле `node.text` в JSON отсутствует (грузится при загрузке
121
+ доски). Это удобно для редактирования: можно править .md руками, и редактор
122
+ подхватит изменения при следующем открытии.
123
+
124
+ ## Файловые операции редактора
125
+
126
+ - **Удаление ноды**: файл (если был) переезжает в `<root>/_deleted/<уникальное-имя>`.
127
+ Cmd+Z восстанавливает обратно (movedFiles в history).
128
+ - **Замена/перегенерация**: новый файл записывается в соответствующую
129
+ подпапку, старый сохраняется в `node.history[]` для отката.
130
+ - **Импорт через drag-drop**: файлы копируются в правильную подпапку
131
+ (clips/images/audio) с уникальным именем.
132
+
133
+ ## Что НЕ трогать руками (если хочешь долго жить)
134
+
135
+ - Поля с `id` в формате UUID — на них завязаны connections, timeline-clips,
136
+ history. Меняй name, prompt, x/y свободно.
137
+ - `history.past`/`future` — снимки всей сцены. Лучше не редактировать, иначе
138
+ Cmd+Z восстановит мусор.
139
+
140
+ ## Совет для AI-агентов
141
+
142
+ При работе с этой папкой:
143
+ 1. Читай `scene.json` чтобы понять структуру нод и связей.
144
+ 2. Текст текстовых нод — в `texts/`. Читай и пиши .md напрямую.
145
+ 3. Если меняешь `scene.json` — сохраняй валидный JSON и не трогай поля
146
+ которые не понимаешь (особенно `history`).
147
+ 4. Бинарные ресурсы (клипы/картинки/аудио) лежат в подпапках по типу.
148
+ Импорт через drag-drop в редакторе автоматически кладёт в правильное
149
+ место и регистрирует ноду на холсте.
Binary file
Binary file
Binary file
@@ -0,0 +1,53 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="187 28 660 660">
3
+ <!-- Generator: Adobe Illustrator 30.1.0, SVG Export Plug-In . SVG Version: 2.1.1 Build 136) -->
4
+ <defs>
5
+ <style>
6
+ .st0 {
7
+ fill: url(#linear-gradient2);
8
+ }
9
+
10
+ .st1 {
11
+ fill: url(#linear-gradient1);
12
+ }
13
+
14
+ .st2 {
15
+ fill: url(#linear-gradient3);
16
+ }
17
+
18
+ .st3 {
19
+ fill: url(#linear-gradient5);
20
+ }
21
+
22
+ .st4 {
23
+ fill: url(#linear-gradient4);
24
+ }
25
+
26
+ .st5 {
27
+ fill: url(#linear-gradient);
28
+ }
29
+
30
+ .st6 {
31
+ fill: #ca974d;
32
+ }
33
+ </style>
34
+ <linearGradient id="linear-gradient" x1="345.78" y1="473.82" x2="686.62" y2="473.82" gradientUnits="userSpaceOnUse">
35
+ <stop offset="0" stop-color="#e37"/>
36
+ <stop offset=".16" stop-color="#e62e6f"/>
37
+ <stop offset=".66" stop-color="#d3225b"/>
38
+ <stop offset="1" stop-color="#cc1e54"/>
39
+ </linearGradient>
40
+ <linearGradient id="linear-gradient1" x1="317.88" y1="333.01" x2="714.14" y2="333.01" xlink:href="#linear-gradient"/>
41
+ <linearGradient id="linear-gradient2" x1="351.19" y1="343.18" x2="680.95" y2="343.18" xlink:href="#linear-gradient"/>
42
+ <linearGradient id="linear-gradient3" x1="469.89" y1="423.35" x2="508.91" y2="423.35" xlink:href="#linear-gradient"/>
43
+ <linearGradient id="linear-gradient4" x1="523.34" y1="423.45" x2="562.01" y2="423.45" xlink:href="#linear-gradient"/>
44
+ <linearGradient id="linear-gradient5" x1="472.29" y1="532.79" x2="560" y2="532.79" xlink:href="#linear-gradient"/>
45
+ </defs>
46
+ <path class="st5" d="M651.37,560.31c-20.47,18.56-39.53,31.76-63.49,45.47-7.11,4.07-14.56,7.3-22.02,10.97-12.16,5.98-24.3,10.14-37.36,13.43-5.5,1.38-10.33,2.89-15.89,1.92-16.55-2.89-31.28-8.36-46.39-15.39-42.88-19.93-86.63-51.65-115.67-88.99-10.95-14.09-.65-30.75,6.63-45.64l11.19-22.85c.85-1.73,2.51-3.39,4.51-2.97,5.11,21.32,10.64,42.33,17.63,63.27,1.21-7.65,1.12-14.38,1.3-21.42.16-6.19-11.14-36.35-10.06-44.47,3.37-4.03,7.51-8.95,5.31-15.74l54.09-31.74c2.56-12.65,13.62-23.58,24.55-29.13,4.94-2.51,10.17-4.45,12.39-10.79-15.02,8.31-32.72,9.47-48.13,1.59-12.34-6.31-18.79-20.97-19.99-35.05l-18.03,1.44c10.68-19.39,39.86-23.91,57.78-13.59l38.51,22.18c14.22,8.19,30.46,10.95,45.92,4.34,15.47-6.62,29.11-15.73,43.74-23.96,12.35-6.95,25.86-10.08,39.49-6.33,9.51,2.62,18,8.31,22.15,17-6.8.73-11.62-1.71-17.51-1.72-.95,22.57-14.02,38.87-36.98,40.79-10.48.88-19.74-.5-29.79-6.39,1.78,6.61,8.04,8.27,12.85,11.26,10.98,6.82,19.41,15.41,23.07,28.21l53.5,31.49c-2,6.66,3.07,12.02,6.01,16.53l-10.01,43.21.39,22.97c2.37-4.21,3.13-8.31,4.45-12.96l14.72-51.99c5.52,5.52,6.89,11.28,9.66,16.76l7.05,13.97c5.17,10.25,14.45,28.23,6.72,38.98-9.39,13.07-20.29,24.46-32.29,35.35ZM472.38,351.12c-9.39-6.06-18.06-11.32-27.75-15.89-2.56-1.21-4.73-3.05-7.84-2.38-2.34,7.33-1.05,15.03,4.33,20.42,8.57,8.59,22.36,6.53,31.26-2.15ZM589.96,353.8c6.83-6.07,7.85-13.98,4.71-22.09-2.3,2.56-5.79,2.72-8.7,4.18-8.82,4.45-16.91,9.41-25.73,14.95,7.82,9.03,21.11,10.61,29.72,2.96ZM543.08,373.71l-8.28-9.75c-6.42-.89-12.4,1.8-18.85,1.99-5.87.18-11.86-3.49-17.78-1.64-3.88,1.22-6.3,6.03-8.08,9.55,7.87,2.45,14.86,5.15,21.52,9.73,2.92,2.01,6.01,2.25,9.09.23,6.83-4.47,13.65-8.08,22.37-10.1ZM521.41,455.69l.47,39.44c31.42.22,65.38,12.56,93.21,27.17,10.47-24.94-9.28-71.59-25.36-92.71-6.4,10.67-15.73,19.23-27.55,22.28-2.77.58-4.6-3.74-4.79-5.58-.72-7.05,7.02-8.5,13.06-13.65,8.84-7.53,11.2-19.58,5.55-29.38-2.73-4.74-5.99-8.05-10.13-11.22-21.48-16.47-35.63,6.68-50.65,5.49-5.03-.4-11.1-3-15.03-5.71-13.23-9.13-28.01-6.67-38.91,4.47s-11.36,26.6.89,36.75c3.41,2.82,7.52,4.8,11.58,7.29,2.13,1.31,1.44,5.51.82,7.42-.56,1.72-3.19,4.89-5.46,4.11-11.44-3.9-20.6-12.03-26.57-22.13-16.34,22.19-35.69,65.74-25.33,92.48,28.47-14.83,60.07-26.28,92.73-27.1l.2-22.12c.11-11.59-1.72-20.79,4.57-21.49,2.23-.25,6.67.4,6.71,4.17ZM575.93,574.89c14.99-9.77,28.02-22.77,34.76-39.87-32.23-17.52-75.18-30.47-110.63-25.27-11.41,1.68-22.75,2.8-33.57,6.42-15.81,5.28-30.78,10.51-45.35,19.61,4.95,8.51,9.27,16.53,15.86,23.18,12.8,12.92,28.09,22.73,45.03,29.2,32.91,12.55,65.18,5.46,93.92-13.27Z"/>
47
+ <path class="st1" d="M444.79,244.2c-21.35-4.48-38.81,6.16-50.36,23.4-8.1,12.09-13.48,25.23-19.14,38.57l-10.75-.74c-8-.55-14.4,3.92-18.92,10.25-5.64,7.9-6.48,16.97-2.26,26.08,3.39,7.31,10.47,11.69,18.09,14.48l5.85,64.53c.19,2.1,1.65,5.74-.42,7.17-3.97,2.74-7.27,5.86-8.07,9.94-1.02,5.2.28,9.71,3.76,13.75-.63,4.59-3.69,8.18-5.77,12.38l-20.31,41.03c-15.44-26.68-14.72-62.81-5.96-90.74l12.95-41.26c-21.1-12.34-31.08-36.76-22.56-59.35,6.23-16.5,20.41-27.95,37.93-31.03,4.42-45.01,18.44-90.42,54.14-121.41l14.56,57.01c60.72-24.13,115.06-24.14,176.8.06l14.64-57.35c36.15,31.91,49.05,74.18,54.52,121.49,27.82,5.26,43.93,29.1,40.07,55.48-2.04,13.91-11.17,27.16-24.81,35.22l8.48,26.46c11.14,34.78,17.71,71.31-1.22,105.42l-26.6-52.27,3.76-8.73c3.06-7.11-3.88-12.7-8.61-16.42l3.76-45.54c.74-8.96,2.11-16.94,2.01-26.14,11.77-2.86,20.61-12.01,21.09-23.59.51-12.19-7.37-24.03-19.43-26.3-5.21-.98-10.01.16-14.95.14-8.98-20.92-18.18-44.93-38.23-57.11-16.49-10.02-34.92-6.23-51.16,2.51-20.72,11.15-37.62,21.56-61.18,17.8-24.71-3.94-39.77-20.59-61.69-25.19Z"/>
48
+ <path class="st6" d="M435.47,203.83l-14.38-55.61-9.35-38.66c-.75-3.08-2.14-5.7-1.42-8.43,4.37,4.27,8.99,6.81,13.54,10.24l45.28,34.12,23.92-36.53c7.53-11.5,14.57-22.5,23.08-34.34l46.81,70.56,59.28-43.68-25.3,102.23c-21.47-6.92-43.07-12.55-65.86-13.8-10.6-.58-20.15-1.12-31.15-.31-22.01,2.15-43.04,6.27-64.44,14.21Z"/>
49
+ <path class="st0" d="M606.66,283.16c-6.56,3.15-12.91,2.64-18.63-1.88l-38.63,21.94-18.75,10.57c1.29,9.71-5.24,17.29-14.11,17.42-9.2.13-16.47-7.4-15.17-17.62-4.11-3.34-8.99-4.84-13.64-7.47l-43.52-24.61c-6.01,4.12-12.08,4.87-18.66,1.39l-45.6,41.21c.82,6.5,1.44,13.41-4.61,18,5.76,20.71,14.32,41.42,34.38,51.37,8.71,4.32,18.14,4.45,27.55,5.08l-53.42,31.36c-1.78,1.05-7.33-1.99-7.64-4.03l-7.29-79.54c-5.67-.14-10.62-2.08-13.87-5.95-3.41-4.07-5.09-9.98-2.78-15.23,3.63-8.25,12.54-11.13,20.84-7.83l42.63-37.51c2.22-1.96,4.05-3.34,3.46-6.81-1.62-9.59,4.72-17.06,14.2-17.53,8.73-.43,15.75,7.34,14.78,17.1,3.73,3.67,8.77,5.26,13.44,7.91l44.22,25.06c5.95-5.53,14.5-5.8,20.18.33l58.14-32.63c-1.71-10.14,5.33-17.63,14.4-17.65,9.15-.02,16.06,7.94,14.24,17.38-.66,3.41.92,4.44,3.04,6.32l43.21,38.3c7.28-3.14,14.77-1.5,19.28,4.53,4.24,5.66,3.19,13.88-1.85,19.43-3.12,3.44-8.9,3.5-12.47,5.08-2.72,5.64-1.82,12.65-2.47,18.72-2.24,20.68-3.83,40.76-4.78,61.37l-8.08,4.16-53.86-32.66c19.05,1.46,36.8-6.13,47.41-22.28,6.06-9.23,13.46-21.38,13.23-32.78-.12-6.02-7.74-11.85-2.55-19.11l-46.24-40.89Z"/>
50
+ <path class="st2" d="M504.93,444.7c-2.51-4.48-3.52-9.75-8.29-11.51l-19.1-7.07c-2.4-.89-5.06-3.81-6.35-6.06-2.54-4.4-1.08-9.93,2.01-13.38s8.41-6.03,13.58-3.95c7.68,3.09,14.23,9.32,18.85,16.5,4.88,7.59,4.06,18.2-.69,25.47Z"/>
51
+ <path class="st4" d="M559.15,422.76c-8.38,9.64-26.77,3.43-31.78,22.11-4.96-7.44-5.61-18.35-.5-26.09,5.74-8.7,20.61-23.47,31.25-13.31,4.13,3.94,5.7,11.92,1.03,17.29Z"/>
52
+ <path class="st3" d="M524.03,535.9l-14.05-.02c-11.45-.02-22.07,3.47-32.95,5.8-2.55.55-4.76-3.47-4.74-5.31.02-2.22.49-5.71,3.1-6.44,8.82-2.46,21.87-5.4,30.65-5.82,17.47-.84,34.53.18,50.98,6.09,2.81,1.01,3.38,4.76,2.76,7.1-.49,1.84-2.84,4.92-5.48,4.35-10.16-2.19-19.79-5.73-30.27-5.75Z"/>
53
+ </svg>
Binary file
@@ -0,0 +1,53 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 1456 720">
3
+ <!-- Generator: Adobe Illustrator 30.1.0, SVG Export Plug-In . SVG Version: 2.1.1 Build 136) -->
4
+ <defs>
5
+ <style>
6
+ .st0 {
7
+ fill: url(#linear-gradient2);
8
+ }
9
+
10
+ .st1 {
11
+ fill: url(#linear-gradient1);
12
+ }
13
+
14
+ .st2 {
15
+ fill: url(#linear-gradient3);
16
+ }
17
+
18
+ .st3 {
19
+ fill: url(#linear-gradient5);
20
+ }
21
+
22
+ .st4 {
23
+ fill: url(#linear-gradient4);
24
+ }
25
+
26
+ .st5 {
27
+ fill: url(#linear-gradient);
28
+ }
29
+
30
+ .st6 {
31
+ fill: #ca974d;
32
+ }
33
+ </style>
34
+ <linearGradient id="linear-gradient" x1="345.78" y1="473.82" x2="686.62" y2="473.82" gradientUnits="userSpaceOnUse">
35
+ <stop offset="0" stop-color="#e37"/>
36
+ <stop offset=".16" stop-color="#e62e6f"/>
37
+ <stop offset=".66" stop-color="#d3225b"/>
38
+ <stop offset="1" stop-color="#cc1e54"/>
39
+ </linearGradient>
40
+ <linearGradient id="linear-gradient1" x1="317.88" y1="333.01" x2="714.14" y2="333.01" xlink:href="#linear-gradient"/>
41
+ <linearGradient id="linear-gradient2" x1="351.19" y1="343.18" x2="680.95" y2="343.18" xlink:href="#linear-gradient"/>
42
+ <linearGradient id="linear-gradient3" x1="469.89" y1="423.35" x2="508.91" y2="423.35" xlink:href="#linear-gradient"/>
43
+ <linearGradient id="linear-gradient4" x1="523.34" y1="423.45" x2="562.01" y2="423.45" xlink:href="#linear-gradient"/>
44
+ <linearGradient id="linear-gradient5" x1="472.29" y1="532.79" x2="560" y2="532.79" xlink:href="#linear-gradient"/>
45
+ </defs>
46
+ <path class="st5" d="M651.37,560.31c-20.47,18.56-39.53,31.76-63.49,45.47-7.11,4.07-14.56,7.3-22.02,10.97-12.16,5.98-24.3,10.14-37.36,13.43-5.5,1.38-10.33,2.89-15.89,1.92-16.55-2.89-31.28-8.36-46.39-15.39-42.88-19.93-86.63-51.65-115.67-88.99-10.95-14.09-.65-30.75,6.63-45.64l11.19-22.85c.85-1.73,2.51-3.39,4.51-2.97,5.11,21.32,10.64,42.33,17.63,63.27,1.21-7.65,1.12-14.38,1.3-21.42.16-6.19-11.14-36.35-10.06-44.47,3.37-4.03,7.51-8.95,5.31-15.74l54.09-31.74c2.56-12.65,13.62-23.58,24.55-29.13,4.94-2.51,10.17-4.45,12.39-10.79-15.02,8.31-32.72,9.47-48.13,1.59-12.34-6.31-18.79-20.97-19.99-35.05l-18.03,1.44c10.68-19.39,39.86-23.91,57.78-13.59l38.51,22.18c14.22,8.19,30.46,10.95,45.92,4.34,15.47-6.62,29.11-15.73,43.74-23.96,12.35-6.95,25.86-10.08,39.49-6.33,9.51,2.62,18,8.31,22.15,17-6.8.73-11.62-1.71-17.51-1.72-.95,22.57-14.02,38.87-36.98,40.79-10.48.88-19.74-.5-29.79-6.39,1.78,6.61,8.04,8.27,12.85,11.26,10.98,6.82,19.41,15.41,23.07,28.21l53.5,31.49c-2,6.66,3.07,12.02,6.01,16.53l-10.01,43.21.39,22.97c2.37-4.21,3.13-8.31,4.45-12.96l14.72-51.99c5.52,5.52,6.89,11.28,9.66,16.76l7.05,13.97c5.17,10.25,14.45,28.23,6.72,38.98-9.39,13.07-20.29,24.46-32.29,35.35ZM472.38,351.12c-9.39-6.06-18.06-11.32-27.75-15.89-2.56-1.21-4.73-3.05-7.84-2.38-2.34,7.33-1.05,15.03,4.33,20.42,8.57,8.59,22.36,6.53,31.26-2.15ZM589.96,353.8c6.83-6.07,7.85-13.98,4.71-22.09-2.3,2.56-5.79,2.72-8.7,4.18-8.82,4.45-16.91,9.41-25.73,14.95,7.82,9.03,21.11,10.61,29.72,2.96ZM543.08,373.71l-8.28-9.75c-6.42-.89-12.4,1.8-18.85,1.99-5.87.18-11.86-3.49-17.78-1.64-3.88,1.22-6.3,6.03-8.08,9.55,7.87,2.45,14.86,5.15,21.52,9.73,2.92,2.01,6.01,2.25,9.09.23,6.83-4.47,13.65-8.08,22.37-10.1ZM521.41,455.69l.47,39.44c31.42.22,65.38,12.56,93.21,27.17,10.47-24.94-9.28-71.59-25.36-92.71-6.4,10.67-15.73,19.23-27.55,22.28-2.77.58-4.6-3.74-4.79-5.58-.72-7.05,7.02-8.5,13.06-13.65,8.84-7.53,11.2-19.58,5.55-29.38-2.73-4.74-5.99-8.05-10.13-11.22-21.48-16.47-35.63,6.68-50.65,5.49-5.03-.4-11.1-3-15.03-5.71-13.23-9.13-28.01-6.67-38.91,4.47s-11.36,26.6.89,36.75c3.41,2.82,7.52,4.8,11.58,7.29,2.13,1.31,1.44,5.51.82,7.42-.56,1.72-3.19,4.89-5.46,4.11-11.44-3.9-20.6-12.03-26.57-22.13-16.34,22.19-35.69,65.74-25.33,92.48,28.47-14.83,60.07-26.28,92.73-27.1l.2-22.12c.11-11.59-1.72-20.79,4.57-21.49,2.23-.25,6.67.4,6.71,4.17ZM575.93,574.89c14.99-9.77,28.02-22.77,34.76-39.87-32.23-17.52-75.18-30.47-110.63-25.27-11.41,1.68-22.75,2.8-33.57,6.42-15.81,5.28-30.78,10.51-45.35,19.61,4.95,8.51,9.27,16.53,15.86,23.18,12.8,12.92,28.09,22.73,45.03,29.2,32.91,12.55,65.18,5.46,93.92-13.27Z"/>
47
+ <path class="st1" d="M444.79,244.2c-21.35-4.48-38.81,6.16-50.36,23.4-8.1,12.09-13.48,25.23-19.14,38.57l-10.75-.74c-8-.55-14.4,3.92-18.92,10.25-5.64,7.9-6.48,16.97-2.26,26.08,3.39,7.31,10.47,11.69,18.09,14.48l5.85,64.53c.19,2.1,1.65,5.74-.42,7.17-3.97,2.74-7.27,5.86-8.07,9.94-1.02,5.2.28,9.71,3.76,13.75-.63,4.59-3.69,8.18-5.77,12.38l-20.31,41.03c-15.44-26.68-14.72-62.81-5.96-90.74l12.95-41.26c-21.1-12.34-31.08-36.76-22.56-59.35,6.23-16.5,20.41-27.95,37.93-31.03,4.42-45.01,18.44-90.42,54.14-121.41l14.56,57.01c60.72-24.13,115.06-24.14,176.8.06l14.64-57.35c36.15,31.91,49.05,74.18,54.52,121.49,27.82,5.26,43.93,29.1,40.07,55.48-2.04,13.91-11.17,27.16-24.81,35.22l8.48,26.46c11.14,34.78,17.71,71.31-1.22,105.42l-26.6-52.27,3.76-8.73c3.06-7.11-3.88-12.7-8.61-16.42l3.76-45.54c.74-8.96,2.11-16.94,2.01-26.14,11.77-2.86,20.61-12.01,21.09-23.59.51-12.19-7.37-24.03-19.43-26.3-5.21-.98-10.01.16-14.95.14-8.98-20.92-18.18-44.93-38.23-57.11-16.49-10.02-34.92-6.23-51.16,2.51-20.72,11.15-37.62,21.56-61.18,17.8-24.71-3.94-39.77-20.59-61.69-25.19Z"/>
48
+ <path class="st6" d="M435.47,203.83l-14.38-55.61-9.35-38.66c-.75-3.08-2.14-5.7-1.42-8.43,4.37,4.27,8.99,6.81,13.54,10.24l45.28,34.12,23.92-36.53c7.53-11.5,14.57-22.5,23.08-34.34l46.81,70.56,59.28-43.68-25.3,102.23c-21.47-6.92-43.07-12.55-65.86-13.8-10.6-.58-20.15-1.12-31.15-.31-22.01,2.15-43.04,6.27-64.44,14.21Z"/>
49
+ <path class="st0" d="M606.66,283.16c-6.56,3.15-12.91,2.64-18.63-1.88l-38.63,21.94-18.75,10.57c1.29,9.71-5.24,17.29-14.11,17.42-9.2.13-16.47-7.4-15.17-17.62-4.11-3.34-8.99-4.84-13.64-7.47l-43.52-24.61c-6.01,4.12-12.08,4.87-18.66,1.39l-45.6,41.21c.82,6.5,1.44,13.41-4.61,18,5.76,20.71,14.32,41.42,34.38,51.37,8.71,4.32,18.14,4.45,27.55,5.08l-53.42,31.36c-1.78,1.05-7.33-1.99-7.64-4.03l-7.29-79.54c-5.67-.14-10.62-2.08-13.87-5.95-3.41-4.07-5.09-9.98-2.78-15.23,3.63-8.25,12.54-11.13,20.84-7.83l42.63-37.51c2.22-1.96,4.05-3.34,3.46-6.81-1.62-9.59,4.72-17.06,14.2-17.53,8.73-.43,15.75,7.34,14.78,17.1,3.73,3.67,8.77,5.26,13.44,7.91l44.22,25.06c5.95-5.53,14.5-5.8,20.18.33l58.14-32.63c-1.71-10.14,5.33-17.63,14.4-17.65,9.15-.02,16.06,7.94,14.24,17.38-.66,3.41.92,4.44,3.04,6.32l43.21,38.3c7.28-3.14,14.77-1.5,19.28,4.53,4.24,5.66,3.19,13.88-1.85,19.43-3.12,3.44-8.9,3.5-12.47,5.08-2.72,5.64-1.82,12.65-2.47,18.72-2.24,20.68-3.83,40.76-4.78,61.37l-8.08,4.16-53.86-32.66c19.05,1.46,36.8-6.13,47.41-22.28,6.06-9.23,13.46-21.38,13.23-32.78-.12-6.02-7.74-11.85-2.55-19.11l-46.24-40.89Z"/>
50
+ <path class="st2" d="M504.93,444.7c-2.51-4.48-3.52-9.75-8.29-11.51l-19.1-7.07c-2.4-.89-5.06-3.81-6.35-6.06-2.54-4.4-1.08-9.93,2.01-13.38s8.41-6.03,13.58-3.95c7.68,3.09,14.23,9.32,18.85,16.5,4.88,7.59,4.06,18.2-.69,25.47Z"/>
51
+ <path class="st4" d="M559.15,422.76c-8.38,9.64-26.77,3.43-31.78,22.11-4.96-7.44-5.61-18.35-.5-26.09,5.74-8.7,20.61-23.47,31.25-13.31,4.13,3.94,5.7,11.92,1.03,17.29Z"/>
52
+ <path class="st3" d="M524.03,535.9l-14.05-.02c-11.45-.02-22.07,3.47-32.95,5.8-2.55.55-4.76-3.47-4.74-5.31.02-2.22.49-5.71,3.1-6.44,8.82-2.46,21.87-5.4,30.65-5.82,17.47-.84,34.53.18,50.98,6.09,2.81,1.01,3.38,4.76,2.76,7.1-.49,1.84-2.84,4.92-5.48,4.35-10.16-2.19-19.79-5.73-30.27-5.75Z"/>
53
+ </svg>
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ // CLI launcher для KingKont. Без аргументов — запускает Electron-приложение.
3
+ // С `serve [path]` — поднимает только HTTP-сервер для запуска редактора в браузере.
4
+ const path = require('node:path');
5
+ const { spawn } = require('node:child_process');
6
+
7
+ const root = path.resolve(__dirname, '..');
8
+ const args = process.argv.slice(2);
9
+
10
+ function showHelp() {
11
+ console.log(`
12
+ KingKont · Chatium — видео-редактор сериала
13
+
14
+ Запуск:
15
+ npx kingkont запустить Electron-приложение (рекомендуется)
16
+ npx kingkont serve запустить только HTTP-сервер; URL для Chrome
17
+ npx kingkont serve <path> то же, путь к проекту/cwd по умолчанию
18
+
19
+ Опции:
20
+ --port <N> порт сервера (по умолчанию 17893)
21
+ --help, -h эта справка
22
+ `);
23
+ }
24
+
25
+ if (args.includes('--help') || args.includes('-h')) {
26
+ showHelp();
27
+ process.exit(0);
28
+ }
29
+
30
+ const portIdx = args.indexOf('--port');
31
+ const port = portIdx >= 0 ? parseInt(args[portIdx + 1], 10) : 17893;
32
+
33
+ if (args[0] === 'serve') {
34
+ // Только Node-сервер. FSAH-API в Chrome требует user-gesture для
35
+ // showDirectoryPicker — юзер сам выбирает папку через UI.
36
+ process.env.PORT = String(port);
37
+ // Если задан путь — на старте просто печатаем подсказку, открыть его
38
+ // через FSAH юзер должен руками (нельзя без gesture).
39
+ const targetPath = args[1] && !args[1].startsWith('--') ? path.resolve(args[1]) : null;
40
+ // Подгружаем сервер. Если ключи не в env — попробуем взять из userData
41
+ // (так же как делает main.js).
42
+ applySettingsToEnv();
43
+ const { start } = require(path.join(root, 'server.js'));
44
+ start(port).then(actualPort => {
45
+ const url = `http://localhost:${actualPort}/`;
46
+ console.log(`\n▶ KingKont готов: ${url}`);
47
+ if (targetPath) console.log(` подразумеваемый проект: ${targetPath}`);
48
+ console.log(` открой в Chrome / Edge / Brave (FSAH-API нужен)\n`);
49
+ }).catch(err => {
50
+ console.error('Не удалось запустить сервер:', err.message);
51
+ process.exit(1);
52
+ });
53
+ } else {
54
+ // Electron-приложение.
55
+ applySettingsToEnv();
56
+ const electronPath = (() => {
57
+ try { return require('electron'); }
58
+ catch { return null; }
59
+ })();
60
+ if (!electronPath) {
61
+ console.error('electron не установлен. Поставь: npm i electron@32');
62
+ process.exit(1);
63
+ }
64
+ const proc = spawn(electronPath, [root], { stdio: 'inherit', env: process.env });
65
+ proc.on('exit', code => process.exit(code || 0));
66
+ }
67
+
68
+ // Прокидываем сохранённые ключи из userData/settings.json в process.env,
69
+ // чтобы server.js (handleGenerate/Tts/Sfx/Music/Text) их подхватил.
70
+ function applySettingsToEnv() {
71
+ try {
72
+ const fs = require('node:fs');
73
+ const os = require('node:os');
74
+ // На macOS userData = ~/Library/Application Support/KingKont
75
+ const candidates = [
76
+ path.join(os.homedir(), 'Library', 'Application Support', 'KingKont', 'settings.json'),
77
+ path.join(os.homedir(), '.config', 'KingKont', 'settings.json'),
78
+ ];
79
+ for (const p of candidates) {
80
+ if (!fs.existsSync(p)) continue;
81
+ const s = JSON.parse(fs.readFileSync(p, 'utf-8'));
82
+ if (s.kieKey) process.env.KIE_API_KEY = s.kieKey;
83
+ if (s.elevenKey) process.env.ELEVENLABS_API_KEY = s.elevenKey;
84
+ if (s.openrouterKey) process.env.OPENROUTER_API_KEY = s.openrouterKey;
85
+ break;
86
+ }
87
+ } catch {}
88
+ }