From 75532d8d8efdc766a2759278ab12d64d87e8a8af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 13 May 2026 10:37:14 +0400 Subject: [PATCH] =?UTF-8?q?fix(console):=20v1.3.90=20=E2=80=94=20deps=20te?= =?UTF-8?q?xtarea=20compact,=20linter=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B,=20py?= =?UTF-8?q?thon=20env=20v1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - deps textarea: rows=3, resize:none, overflow-y:auto - aiCheck (Python): после линтера проверяет внешние импорты если deps поле пустое — предупреждение с именами модулей - Python env: v1.0 → v1.1 (содержит boto3+requests+psycopg2-binary) --- console/deploy/console.yaml | 2 +- console/internal/model/types.go | 2 +- console/ui/index.html | 12 +++---- console/ui/js/ai.js | 58 ++++++++++++++++++++++++++++++++- 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/console/deploy/console.yaml b/console/deploy/console.yaml index f8a3a0f..5797442 100644 --- a/console/deploy/console.yaml +++ b/console/deploy/console.yaml @@ -58,7 +58,7 @@ spec: serviceAccountName: fission-console containers: - name: console - image: naeel/fission-console:v1.3.89 + image: naeel/fission-console:v1.3.90 imagePullPolicy: Always ports: - containerPort: 8090 diff --git a/console/internal/model/types.go b/console/internal/model/types.go index 74e115f..3edd03d 100644 --- a/console/internal/model/types.go +++ b/console/internal/model/types.go @@ -70,7 +70,7 @@ type LangEnvDef struct { // LangEnvMap сопоставляет идентификатор языка (string) с описанием среды выполнения. // Ключ используется в createFunctionRequest.Language и как суффикс имени Environment. var LangEnvMap = map[string]LangEnvDef{ - "python": {Image: "naeel/fission-python-env:v1.0"}, + "python": {Image: "naeel/fission-python-env:v1.1"}, "nodejs": {Image: "ghcr.io/fission/node-env"}, "go": {Image: "ghcr.io/fission/go-env", BuilderImage: "naeel/go-builder-fast:v1"}, "php": {Image: "ghcr.io/fission/php-env"}, diff --git a/console/ui/index.html b/console/ui/index.html index 421d8b2..a4c4bb6 100644 --- a/console/ui/index.html +++ b/console/ui/index.html @@ -103,7 +103,7 @@
NUBES
FISSION CONSOLE
-
v1.3.89
+
v1.3.90
@@ -308,9 +308,9 @@
- +psycopg2-binary" style="width:100%; box-sizing:border-box; font-family:monospace; font-size:12px; background:#1a1a2e; border:1px dashed #3a3a5c; border-radius:4px; color:#cdd6f4; padding:6px 8px; resize:none; overflow-y:auto;">
- +psycopg2-binary" style="width:100%; box-sizing:border-box; font-family:monospace; font-size:12px; background:#1a1a2e; border:1px dashed #3a3a5c; border-radius:4px; color:#cdd6f4; padding:6px 8px; resize:none; overflow-y:auto;">
- v1.3.89 + v1.3.90
diff --git a/console/ui/js/ai.js b/console/ui/js/ai.js index 846eaf8..01193ff 100644 --- a/console/ui/js/ai.js +++ b/console/ui/js/ai.js @@ -1,5 +1,43 @@ /* ai.js — AI/LLM функции: проверка, генерация, объяснение, ассистент */ +// PYTHON_STDLIB — стандартная библиотека Python (не требуют pip install). +var PYTHON_STDLIB = new Set([ + 'os','sys','json','time','re','math','io','collections','itertools','functools', + 'datetime','pathlib','urllib','http','threading','asyncio','logging','random', + 'string','struct','hashlib','hmac','base64','uuid','copy','abc','typing', + 'dataclasses','contextlib','enum','warnings','traceback','inspect','importlib', + 'subprocess','socket','ssl','email','html','xml','csv','sqlite3','unittest', + 'gc','weakref','array','queue','heapq','bisect','decimal','fractions', + 'statistics','textwrap','difflib','shutil','glob','fnmatch','tempfile', + 'zipfile','tarfile','gzip','bz2','lzma','pickle','shelve','codecs', + 'unicodedata','ast','dis','types','builtins','operator','numbers','cmath', + 'pprint','reprlib','platform','signal','mmap','ctypes','multiprocessing', + 'concurrent','select','selectors','errno','atexit','sched','calendar', + 'locale','gettext','argparse','getopt','shlex','configparser','tokenize', + 'runpy','pkgutil','site','sysconfig','distutils','zipimport','abc','io', + '__future__','_thread','threading','contextvars','netrc','plistlib', + 'html','xml','http','urllib','email','mailbox','mimetypes','encodings', + 'codecs','unicodedata','readline','rlcompleter','curses','idlelib','tkinter', +]); + +// detectExternalPythonImports — возвращает список модулей, которых нет в stdlib. +function detectExternalPythonImports(code) { + var external = []; + var seen = {}; + var patterns = [/^import\s+([\w]+)/gm, /^from\s+([\w]+)/gm]; + for (var pi = 0; pi < patterns.length; pi++) { + var m; + while ((m = patterns[pi].exec(code)) !== null) { + var mod = m[1]; + if (!PYTHON_STDLIB.has(mod) && !seen[mod]) { + seen[mod] = true; + external.push(mod); + } + } + } + return external; +} + function llmGeneratedWarning(lang) { var text = 'Сделано LLM. Не доверяй, проверяй!'; switch (lang) { @@ -45,7 +83,25 @@ async function aiCheck(codeId, langId, resultId) { var data = await requestJSON(API_BASE + '/ai/check', 'POST', { language: lang, code: code }); resEl.style.background = data.ok ? '#1a3a1a' : '#3a1a1a'; resEl.style.color = data.ok ? '#8f8' : '#f88'; - resEl.textContent = data.result || '(пустой ответ)'; + var resultText = data.result || '(пустой ответ)'; + + // Для Python: проверяем внешние импорты vs поле зависимостей + if (lang === 'python') { + var depsId = codeId.replace('-code', '-deps'); // cc-code→cc-deps, e-code→e-deps + var depsEl = document.getElementById(depsId); + var depsVal = depsEl ? depsEl.value.trim() : ''; + var external = detectExternalPythonImports(code); + if (external.length > 0 && !depsVal) { + resultText += '\n\n⚠️ Внешние библиотеки: ' + external.join(', ') + + '\nДобавьте их в поле "Зависимости (requirements.txt)" или убедитесь что они уже есть в Python-окружении.'; + if (data.ok) { + resEl.style.background = '#3a2a00'; + resEl.style.color = '#ffa'; + } + } + } + + resEl.textContent = resultText; } catch (e) { resEl.style.background = '#3a2a00'; resEl.style.color = '#ffa';