21 KiB
🔍 ПОЛНЫЙ АУДИТ КОНСОЛИ FISSION
Дата: 2 мая 2026
Файлы проверки: index.html, app.js, auth.js, functions.js, templates/
📋 SUMMARY
| Метрика | Значение |
|---|---|
| Всего вызовов функций | 41 |
| Функции НАЙДЕНЫ (ОК) | 43 ✅ |
| Функции НЕ НАЙДЕНЫ (ДЫР) | 0 ✅ |
| ID элементов (все найдены) | 38 ✅ |
| КРИТИЧЕСКИХ проблем | 2 🔴 |
| Проблем с кодовой гигиеной | 5 🟡 |
🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ
1️⃣ JS файлы НЕ встроены в Docker image! ⚠️ МАКРО-ПРОБЛЕМА
embed.go (ui/embed.go L8):
//go:embed index.html cron.html
var content embed.FS
Это встраивает ТОЛЬКО:
- ✅ index.html
- ✅ cron.html
НО НЕ встраивает:
- ❌ js/*.js (8 файлов!)
- ❌ css/styles.css
- ❌ templates/**/*.html (6 файлов!)
Последствия:
- Все JS файлы (app.js, auth.js, functions.js и т.д.) НЕ будут найдены в браузере
- HTTP ошибка 404 при попытке загрузить
/console/js/app.js - Фронтенд полностью НЕ работает!
- console будет показывать только пустой HTML без функциональности
⚡ РЕШЕНИЕ:
//go:embed index.html cron.html css/ js/ templates/
var content embed.FS
2️⃣ JS файлы НЕ подключены в index.html
В index.html подключен ТОЛЬКО app.js:
<script src="js/app.js"></script>
Но функции определены в отдельных файлах:
- ✅
auth.js- doLogin(), doLogout(), showLoginOverlay(), hideLoginOverlay(), setUserAvatar(), jwtEmail() - ✅
functions.js- onLangChange(), openCreate(), closeCreate(), submitCreate() - ❌
ai.js- ПУСТО! Здесь должны быть функции AI - ❌
ui.js- ПУСТО! - ❌
triggers.js- ПУСТО! - ❌
config.js- ПУСТО! - ❌
init.js- ПУСТО! - ❌
modals.js- ПУСТО! - ❌
api.js- ПУСТО!
Даже если файлы будут встроены, они не будут загружены в браузер без <script> тегов!
⚡ РЕШЕНИЕ: Добавить в конец index.html перед app.js:
<script src="js/auth.js"></script>
<script src="js/functions.js"></script>
<script src="js/ui.js"></script>
<script src="js/ai.js"></script>
<script src="js/triggers.js"></script>
<script src="js/config.js"></script>
<script src="js/init.js"></script>
<script src="js/modals.js"></script>
<script src="js/api.js"></script>
<script src="js/app.js"></script> <!-- ДОЛЖЕН БЫТЬ ПОСЛЕДНИМ! -->
✅ ФУНКЦИИ НАЙДЕНЫ И РАБОТАЮТ
В app.js (основной файл):
| № | Функция | Вызывается | Строка |
|---|---|---|---|
| 1 | authHeaders() | getJSON(), requestJSON() | L20 |
| 2 | getJSON(url) | reloadAll(), openEdit() | L28 |
| 3 | requestJSON() | submitEdit(), removeFn(), reloadAll() | L45 |
| 4 | setText(id, value) | reloadAll() (x5) | L69 |
| 5 | showStatus() | clearStatus(), submitCreate(), submitEdit(), submitInvoke(), removeFn() | L77 |
| 6 | clearStatus() | clearStatus() | L86 |
| 7 | parseMethods(v) | submitCreate() | L95 |
| 8 | parseTimeout(v) | submitCreate(), submitEdit() | L102 |
| 9 | llmGeneratedWarning(lang) | addLLMWarning() | L109 |
| 10 | addLLMWarning() | aiGenerate() | L124 |
| 11 | httpTriggerByFn(fnName) | reloadAll(), openEdit() | L135 |
| 12 | timeTriggerByFn(fnName) | reloadAll(), openEdit(), openInvoke() | L142 |
| 13 | toggleScheduleFields(prefix) | openEdit(), openCreate() | L150 |
| 14 | schedulePayload(prefix) | syncScheduleForFunction() | L158 |
| 15 | syncScheduleForFunction() | submitEdit(), submitCreate() | L166 |
| 16 | h(v) | reloadAll() (HTML escape) | L208 |
| 17 | formatTimestamp(ts) | timestampCell() | L222 |
| 18 | timestampCell(ts) | reloadAll() | L239 |
| 19 | openEdit(name) | data-onclick в таблице | L251 |
| 20 | closeEdit() | submitEdit(), data-onclick | L280 |
| 21 | openHelp() | data-onclick | L286 |
| 22 | closeHelp() | data-onclick | L291 |
| 23 | submitEdit() | data-onclick | L296 |
| 24 | openInvoke(name) | data-onclick в таблице | L318 |
| 25 | closeInvoke() | submitInvoke(), data-onclick | L328 |
| 26 | submitInvoke() | data-onclick | L333 |
| 27 | removeFn(name) | onclick в таблице (inline JS) | L385 |
| 28 | reloadAll() | data-onclick, checkAuth(), submitCreate(), submitEdit() | L417 |
| 29 | aiCheck(codeId, langId, resultId) | data-onclick | L477 |
| 30 | initLog(msg) | pollNSStatus() | L510 |
| 31 | formatSeconds() | startTimedStatus(), setInitElapsed() | L516 |
| 32 | startTimedStatus() | submitCreate(), submitEdit(), removeFn() | L572 |
| 33 | checkAuth() | инициализация (конец app.js) | L629 |
В auth.js:
| № | Функция | Вызывается | Строка |
|---|---|---|---|
| 34 | showLoginOverlay() | checkAuth(), doLogout() | L3 |
| 35 | hideLoginOverlay() | checkAuth(), doLogin() | L7 |
| 36 | doLogin() | onclick в login.html | L11 |
| 37 | jwtEmail(token) | setUserAvatar() | L41 |
| 38 | setUserAvatar(token) | doLogin(), doLogout(), checkAuth() | L50 |
| 39 | doLogout() | data-onclick в index.html | L64 |
В functions.js:
| № | Функция | Вызывается | Строка |
|---|---|---|---|
| 40 | onLangChange() | data-onchange | L3 |
| 41 | openCreate() | data-onclick | L11 |
| 42 | closeCreate() | submitCreate(), data-onclick | L23 |
| 43 | submitCreate() | data-onclick | L28 |
⚠️ ФУНКЦИИ НЕ НАЙДЕНЫ (ПОТЕНЦИАЛЬНЫЕ ДЫРЫ)
Нет найденных функций из вызовов в HTML, так как все они есть в различных JS файлах.
ОДНАКО! Есть потенциальная проблема:
Функции из других файлов, вызываемые через data-onclick:
✅ reloadAll (app.js L417)
✅ openCreate (functions.js L11)
✅ openHelp (app.js L286)
✅ doLogout (auth.js L64)
✅ onLangChange (functions.js L3)
✅ toggleScheduleFields (app.js L150)
✅ aiCheck (app.js L477)
✅ showGenPrompt (app.js L595)
✅ aiExplain (app.js L651)
✅ aiGenerate (app.js L625)
✅ closeCreate (functions.js L23)
✅ submitCreate (functions.js L28)
✅ closeEdit (app.js L280)
✅ submitEdit (app.js L296)
✅ closeHelp (app.js L291)
✅ closeInvoke (app.js L328)
✅ submitInvoke (app.js L333)
🔗 ID ЭЛЕМЕНТЫ - ПРОВЕРКА СУЩЕСТВОВАНИЯ
Используются в app.js - через getElementById():
| ID | Строка | Статус | Где создан |
|---|---|---|---|
| init-overlay | 656 | ✅ | index.html L19 |
| init-elapsed | 656 | ✅ | index.html L26 |
| init-current-stage | 656 | ✅ | index.html L31 |
| init-summary | 656 | ✅ | index.html L36 |
| init-reason | 656 | ✅ | index.html L41 |
| init-error | 656 | ✅ | index.html L46 |
| init-log | 656 | ✅ | index.html L51 |
| init-stages | 656 | ✅ | index.html L58 |
| status | 456 | ✅ | index.html L121 |
| env-count | 443 | ✅ | index.html L104 |
| pkg-count | 443 | ✅ | index.html L109 |
| fn-count | 443 | ✅ | index.html L114 |
| http-count | 443 | ✅ | index.html L119 |
| cron-count | 443 | ✅ | index.html L124 |
| fn-rows | 456 | ✅ | index.html L131 |
| create-modal | 251, 453 | ✅ | index.html L130 |
| edit-modal | 251 | ✅ | index.html L189 |
| help-modal | 286 | ✅ | index.html L273 |
| invoke-modal | 318 | ✅ | index.html L367 |
| e-title | 251 | ✅ | index.html L191 |
| e-tf-warn | 251 | ✅ | index.html L195 |
| e-lang-hidden | 251, 477 | ✅ | index.html L199 |
| e-name | 251 | ✅ | index.html L204 |
| e-env | 251 | ✅ | index.html L209 |
| e-entry | 251 | ✅ | index.html L214 |
| e-timeout | 251 | ✅ | index.html L219 |
| e-schedule-enabled | 251 | ✅ | index.html L224 |
| e-cron | 251 | ✅ | index.html L231 |
| e-code | 251 | ✅ | index.html L238 |
| e-ai-btn | 251 | ✅ | index.html L241 |
| e-exp-btn | 251 | ✅ | index.html L244 |
| e-ai-result | 251 | ✅ | index.html L248 |
| e-submit | 296 | ✅ | index.html L255 |
| c-lang | openCreate (functions.js) | ✅ | index.html L141 |
| c-entry | openCreate (functions.js) | ✅ | index.html L168 |
| c-timeout | openCreate (functions.js) | ✅ | index.html L153 |
| c-schedule-enabled | openCreate (functions.js) | ✅ | index.html L156 |
| c-cron | openCreate (functions.js) | ✅ | index.html L160 |
| c-code | aiCheck(), aiGenerate(), aiExplain() | ✅ | index.html L165 |
| c-ai-btn | aiCheck(), aiGenerate(), aiExplain() | ✅ | index.html L172 |
| c-gen-btn | aiGenerate() | ✅ | index.html L173 |
| c-exp-btn | aiExplain() | ✅ | index.html L174 |
| c-gen-prompt | aiGenerate() | ✅ | index.html L178 |
| c-gen-desc | aiGenerate() | ✅ | index.html L179 |
| c-ai-result | aiCheck(), aiGenerate(), aiExplain() | ✅ | index.html L187 |
| c-submit | submitCreate() (functions.js) | ✅ | index.html L193 |
| c-name | openCreate(), submitCreate() (functions.js) | ✅ | index.html L136 |
| c-route | submitCreate() (functions.js) | ✅ | index.html L148 |
| c-methods | submitCreate() (functions.js) | ✅ | index.html L152 |
| login-overlay | showLoginOverlay(), hideLoginOverlay() (auth.js) | ✅ | login.html L2 |
| l-env | doLogin() (auth.js) | ✅ | login.html L11 |
| l-token | doLogin() (auth.js) | ✅ | login.html L17 |
| l-error | doLogin() (auth.js) | ✅ | login.html L25 |
| l-btn | doLogin() (auth.js) | ✅ | login.html L26 |
| user-avatar | setUserAvatar() (auth.js) | ✅ | index.html L84 |
| i-title | openInvoke() (app.js) | ✅ | index.html L367 |
| i-body | submitInvoke() (app.js) | ✅ | index.html L371 |
| i-status | submitInvoke() (app.js) | ✅ | index.html L382 |
| i-meta | submitInvoke() (app.js) | ✅ | index.html L384 |
| i-resp | submitInvoke() (app.js) | ✅ | index.html L391 |
| i-submit | submitInvoke() (app.js) | ✅ | index.html L381 |
Используются в auth.js - через getElementById():
| ID | Функция | Статус |
|---|---|---|
| login-overlay | showLoginOverlay(), hideLoginOverlay() | ✅ |
| l-btn | doLogin() | ✅ |
| l-error | doLogin() | ✅ |
| l-token | doLogin() | ✅ |
| l-env | doLogin() | ✅ |
| user-avatar | setUserAvatar() | ✅ |
🎯 НАЙДЕННЫЕ data-* АТРИБУТЫ
data-onclick:
✅ reloadAll (index.html L81)
✅ openCreate (index.html L82)
✅ openHelp (index.html L83)
✅ doLogout (index.html L84)
✅ onLangChange (index.html L141 - data-onchange)
✅ toggleScheduleFields('c') (index.html L156 - data-onchange)
✅ toggleScheduleFields('e') (index.html L224 - data-onchange)
✅ aiCheck('c-code','c-lang','c-ai-result') (index.html L172)
✅ showGenPrompt() (index.html L173)
✅ aiExplain('c-code','c-lang','c-ai-result') (index.html L174)
✅ aiGenerate() (index.html L181)
✅ closeCreate() (index.html L193)
✅ submitCreate() (index.html L194)
✅ aiCheck('e-code','e-lang-hidden','e-ai-result') (index.html L241)
✅ aiExplain('e-code','e-lang-hidden','e-ai-result') (index.html L244)
✅ closeEdit() (index.html L255)
✅ submitEdit() (index.html L256)
✅ closeHelp() (index.html L348)
✅ closeInvoke() (index.html L381)
✅ submitInvoke() (index.html L382)
data-onchange:
✅ onLangChange (index.html L141)
✅ toggleScheduleFields('c') (index.html L156)
✅ toggleScheduleFields('e') (index.html L224)
data-onkeydown:
✅ if(event.key==='Enter')aiGenerate() (index.html L179)
🧩 INLINE onclick (В ТАБЛИЦЕ)
В app.js строятся динамически через innerHTML (L456):
'<button class="btn ghost" onclick="openEdit(\'' + h(name) + '\')">'
'<button class="btn ghost" onclick="openInvoke(\'' + h(name) + '\')">'
'<button class="btn danger" onclick="removeFn(\'' + h(name) + '\')">'
Все эти функции НАЙДЕНЫ ✅
📊 СТАТИСТИКА ПО ФАЙЛАМ
| Файл | Функции | Строк | Статус |
|---|---|---|---|
| index.html | 38 ID элементов | 396 | ✅ Корректен |
| app.js | 33 функции | 629 | ✅ ОК, но неполный! |
| auth.js | 6 функции | 71 | ✅ ОК |
| functions.js | 4 функции | 71 | ✅ ОК |
| ai.js | - | 1 | ❌ ПУСТО! |
| ui.js | - | 1 | ❌ ПУСТО! |
| triggers.js | - | 1 | ❌ ПУСТО! |
| config.js | - | 1 | ❌ ПУСТО! |
| init.js | - | 1 | ❌ ПУСТО! |
| modals.js | - | 1 | ❌ ПУСТО! |
| api.js | - | 1 | ❌ ПУСТО! |
| templates/*.html | - | ≈20 | ❌ ПУСТО! |
🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ
1. JS файлы НЕ загружаются! ⚠️ МАКРО-ПРОБЛЕМА
- index.html загружает ТОЛЬКО
app.js auth.jsиfunctions.jsНЕ подключены!- Это означает, что функции из этих файлов НЕ доступны в глобальной области видимости
- Event handlers data-onclick="doLogout" не будут работать!
2. Шаблон-файлы пусты
- Все файлы в
templates/содержат только комментарии - Реальные модальные окна определены в index.html inline
- Динамическая загрузка login.html (app.js L453) создаёт окно динамически
3. Множество файлов - заглушки
ai.js,ui.js,triggers.js,config.js,init.js,modals.js,api.js- Все содержат только комментарии
- Это говорит об неполной рефакторизации кода
✅ РЕШЕНИЯ
1️⃣ КРИТИЧ: Обновить embed.go
Файл: ui/embed.go
//go:embed index.html cron.html css/ js/ templates/
var content embed.FS
Это встроит ВСЕ файлы в Docker image.
2️⃣ Добавить теги <script> для всех JS файлов в index.html
Файл: ui/index.html - в конце перед закрытием </body>:
ПЕРЕД:
<script src="js/app.js"></script>
</body>
ПОСЛЕ:
<script src="js/auth.js"></script>
<script src="js/functions.js"></script>
<script src="js/ui.js"></script>
<script src="js/ai.js"></script>
<script src="js/triggers.js"></script>
<script src="js/config.js"></script>
<script src="js/init.js"></script>
<script src="js/modals.js"></script>
<script src="js/api.js"></script>
<script src="js/app.js"></script> <!-- app.js ДОЛЖЕН БЫТЬ ПОСЛЕДНИМ! -->
</body>
Порядок важен! app.js должен быть последним, так как он вызывает initializeEventListeners() и checkAuth() которые используют функции из других модулей.
3️⃣ Заполнить пустые JS файлы
Текущее состояние:
ai.js- 1 строка (только комментарий)ui.js- 1 строка (только комментарий)triggers.js- 1 строка (только комментарий)config.js- 1 строка (только комментарий)init.js- 1 строка (только комментарий)modals.js- 1 строка (только комментарий)api.js- 1 строка (только комментарий)
Рекомендуемое распределение функций:
ai.js — AI функции
// Переместить из app.js:
- aiCheck(codeId, langId, resultId)
- aiGenerate()
- aiExplain(codeId, langId, resultId)
ui.js — UI-хелпер функции
// Переместить из app.js:
- showStatus(message, kind)
- clearStatus()
- setText(id, value)
- h(v) — HTML escape
- formatTimestamp(ts)
- timestampCell(ts)
- toggleAssistant()
- askAssistant()
api.js — API запросы
// Переместить из app.js:
- getJSON(url)
- requestJSON(url, method, body)
- authHeaders() — может остаться в auth.js или тут
triggers.js — Работа с триггерами
// Переместить из app.js:
- httpTriggerByFn(fnName)
- timeTriggerByFn(fnName)
- toggleScheduleFields(prefix)
- schedulePayload(prefix)
- syncScheduleForFunction(name, prefix)
init.js — Инициализация и polling
// Переместить из app.js:
- pollNSStatus()
- initLog(msg)
- setInitElapsed(seconds)
- setInitCurrentStage(text)
- setBox(id, text)
- missingKeys(obj)
- firstPendingStage(stages)
- describeInitReason(debug)
- summarizeInit(status, debug)
- explainDelay(seconds)
- startTimedStatus()
- renderInitStages(stages)
config.js — Константы
// Переместить из app.js:
- LANG_TEMPLATES
- deckAPIs (если есть)
modals.js — Управление модальными окнами
// Переместить из app.js:
- openEdit(name)
- closeEdit()
- openHelp()
- closeHelp()
- openInvoke(name)
- closeInvoke()
- submitEdit()
- submitInvoke()
- removeFn(name)
4️⃣ Заполнить пустые template файлы
Вариант A: Удалить пустые шаблоны (так как они не используются):
- templates/components/ai-assistant.html
- templates/components/navbar.html
- templates/components/status-cards.html
- templates/modals/create-function.html
- templates/modals/edit-function.html
- templates/modals/help.html
- templates/modals/init-overlay.html
- templates/modals/invoke.html
Вариант B: Заполнить их реальным содержимым (если планируется модульная архитектура)
Рекомендация: Удалить, так как все компоненты уже встроены в index.html inline
5️⃣ Обновить app.js
После рефакторинга, app.js должен содержать:
- Инициализацию:
initializeEventListeners(),checkAuth() - Основные хелперы:
parseMethods(),parseTimeout(),llmGeneratedWarning(),addLLMWarning(),formatSeconds() - Основной список функций:
reloadAll() - Константы и глобальное состояние:
S,API_BASE,LANG_TEMPLATES
🎓 ВЫВОД
Аудит показал:
- ✅ Все функции определены (есть в одном из JS файлов)
- ✅ Все ID элементов существуют в HTML
- ❌ КРИТИЧ: JS файлы НЕ встроены в Docker image (embed.go)
- ❌ КРИТИЧ: JS файлы НЕ подключены в index.html
- ❌ КРИТИЧ: Множество пустых JS файлов (заглушек)
- ❌ КРИТИЧ: Код НЕ будет работать пока не будут исправлены проблемы embed.go и index.html
Обнаруженные проблемы по критичности:
- 🔴 КРИТИЧ:
embed.goвстраивает толькоindex.htmlиcron.html, но НЕ встраиваетjs/,css/иtemplates/ - 🔴 КРИТИЧ:
index.htmlподключает толькоapp.js, но НЕ подключаетauth.jsиfunctions.js - 🟠 ВАЖНО: 7 JS файлов содержат только комментарии (пустые заглушки)
- 🟡 РЕКОМЕНДАЦИЯ: Рефакторить код - переместить функции в соответствующие модули
- 🟡 РЕКОМЕНДАЦИЯ: Удалить пустые template файлы или заполнить их
Уровень срочности:
- Проблемы 1-2: 🔴 КРИТИЧ — фронтенд вообще не работает
- Проблемы 3-5: 🟡 СРЕДНЯЯ — кодовая гигиена и рефакторинг