update
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
Rollback vor 1.2.1-Konsole/White-Box-Fix (20260524_061424)
|
||||
|
||||
Zurueckspielen (PowerShell, im Projektordner):
|
||||
|
||||
foreach ($f in @('aza_desktop.spec','aza_start_panel.spec','basis14.py','desktop_backend_autostart.py','aza_version.py','version.json')) {
|
||||
Copy-Item -LiteralPath ".\backup_update_121_start_console_fix_20260524_061424\$f" -Destination ".\$f" -Force
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
from pathlib import Path
|
||||
from PyInstaller.utils.hooks import collect_submodules
|
||||
|
||||
project_root = Path(SPECPATH)
|
||||
data_dir = project_root / "data"
|
||||
|
||||
hiddenimports = []
|
||||
hiddenimports += collect_submodules("uvicorn")
|
||||
hiddenimports += collect_submodules("fastapi")
|
||||
hiddenimports += collect_submodules("starlette")
|
||||
hiddenimports += collect_submodules("anyio")
|
||||
hiddenimports += collect_submodules("pydantic")
|
||||
|
||||
hiddenimports += [
|
||||
# --- local modules used by basis14.py (desktop) ---
|
||||
"aza_config",
|
||||
"aza_prompts",
|
||||
"aza_persistence",
|
||||
"aza_ui_helpers",
|
||||
"aza_audio",
|
||||
"aza_todo_mixin",
|
||||
"aza_text_windows_mixin",
|
||||
"aza_diktat_mixin",
|
||||
"aza_settings_mixin",
|
||||
"aza_ordner_mixin",
|
||||
"aza_arbeitsplan_mixin",
|
||||
"aza_notizen_mixin",
|
||||
"aza_totp",
|
||||
"aza_consent",
|
||||
"aza_audit_log",
|
||||
"desktop_backend_autostart",
|
||||
"desktop_update_check",
|
||||
"aza_version",
|
||||
"_build_info",
|
||||
"openai_runtime_config",
|
||||
"aza_launcher",
|
||||
"aza_office_workspace_ui",
|
||||
"aza_workspace_sync",
|
||||
"aza_workspace_license",
|
||||
"aza_activation",
|
||||
"security_vault",
|
||||
"aza_med_validator",
|
||||
"aza_style",
|
||||
"aza_admin",
|
||||
"aza_systemstatus",
|
||||
"aza_global_paste",
|
||||
"aza_firewall",
|
||||
"aza_docapp",
|
||||
"translate",
|
||||
"apps.diktat.audio_notiz_app",
|
||||
"apps.diktat.diktat_app",
|
||||
# --- local modules used by backend_main.py ---
|
||||
"backend_main",
|
||||
"aza_tls",
|
||||
"aza_rate_limit",
|
||||
"aza_security",
|
||||
"aza_license_logic",
|
||||
"aza_device_enforcement",
|
||||
"aza_news_backend",
|
||||
"aza_monitoring",
|
||||
"aza_stripe_idempotency",
|
||||
"aza_backup",
|
||||
"aza_macro",
|
||||
"stripe_routes",
|
||||
"admin_routes",
|
||||
"project_status_routes",
|
||||
"services",
|
||||
"services.live_event_search",
|
||||
"services.event_llm_direct",
|
||||
"services.news_llm_search",
|
||||
"services.event_extract_llm",
|
||||
"services.link_verify",
|
||||
# --- third-party that PyInstaller may miss ---
|
||||
"bcrypt",
|
||||
"pyotp",
|
||||
"qrcode",
|
||||
"qrcode.image.pure",
|
||||
"PIL",
|
||||
"PIL.Image",
|
||||
"PIL.ImageTk",
|
||||
"pynput",
|
||||
"pynput.keyboard",
|
||||
"pynput.keyboard._win32",
|
||||
"pynput.mouse",
|
||||
"pynput.mouse._win32",
|
||||
"pynput._util",
|
||||
"pynput._util.win32",
|
||||
"dotenv",
|
||||
"openai",
|
||||
"requests",
|
||||
"stripe",
|
||||
"httpx",
|
||||
"sounddevice",
|
||||
"_sounddevice_data",
|
||||
"numpy",
|
||||
"docx",
|
||||
"docx.opc",
|
||||
"docx.opc.constants",
|
||||
"docx.opc.part",
|
||||
"docx.opc.pkgreader",
|
||||
"lxml",
|
||||
"lxml.etree",
|
||||
]
|
||||
|
||||
datas = [
|
||||
(str(project_root / "logo.png"), "."),
|
||||
(str(project_root / "logo.ico"), "."),
|
||||
(str(project_root / "apps"), "apps"),
|
||||
(str(project_root / "backend_url.txt"), "."),
|
||||
(str(project_root / "backend_token.txt"), "."),
|
||||
(str(project_root / "project_status.json"), "."),
|
||||
(str(project_root / "project_plan.json"), "."),
|
||||
(str(project_root / "project_todos.json"), "."),
|
||||
(str(project_root / "project_roadmap.json"), "."),
|
||||
(str(project_root / "assets"), "assets"),
|
||||
(str(project_root / "legal"), "legal"),
|
||||
]
|
||||
if (project_root / "version.json").is_file():
|
||||
datas.append((str(project_root / "version.json"), "."))
|
||||
|
||||
a = Analysis(
|
||||
[str(project_root / "basis14.py")],
|
||||
pathex=[str(project_root)],
|
||||
binaries=[],
|
||||
datas=datas,
|
||||
hiddenimports=hiddenimports,
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
)
|
||||
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
[],
|
||||
exclude_binaries=True,
|
||||
name="aza_desktop",
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
icon=str(project_root / "logo.ico"),
|
||||
)
|
||||
|
||||
coll = COLLECT(
|
||||
exe,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
name="aza_desktop",
|
||||
)
|
||||
@@ -0,0 +1,75 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
"""PyInstaller one-file: AzA Startpanel / Control Panel (WebView + Matterhorn-Video)."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from PyInstaller.utils.hooks import collect_submodules
|
||||
|
||||
project_root = Path(SPECPATH)
|
||||
|
||||
datas = []
|
||||
for rel in (
|
||||
"assets/matternhorn-aza-2.mp4",
|
||||
"assets/matternhorn.png",
|
||||
"logo.png",
|
||||
"logo.ico",
|
||||
"version.json",
|
||||
):
|
||||
src = project_root / rel
|
||||
if src.is_file():
|
||||
datas.append((str(src), str(Path(rel).parent) if Path(rel).parent != Path(".") else "."))
|
||||
|
||||
hiddenimports = list(collect_submodules("webview")) + [
|
||||
"aza_updater",
|
||||
"aza_update_core",
|
||||
"aza_version",
|
||||
"aza_client_watermark",
|
||||
"_build_info",
|
||||
"PIL",
|
||||
"PIL.Image",
|
||||
"PIL.ImageTk",
|
||||
"PIL.ImageEnhance",
|
||||
"PIL.ImageFilter",
|
||||
"requests",
|
||||
]
|
||||
|
||||
a = Analysis(
|
||||
[str(project_root / "aza_start_panel.py")],
|
||||
pathex=[str(project_root)],
|
||||
binaries=[],
|
||||
datas=datas,
|
||||
hiddenimports=hiddenimports,
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
_icon = project_root / "logo.ico"
|
||||
_icon_arg = {"icon": str(_icon)} if _icon.is_file() else {}
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name="aza_start_panel",
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
**_icon_arg,
|
||||
)
|
||||
@@ -0,0 +1,2 @@
|
||||
APP_VERSION = "1.2.1"
|
||||
APP_CHANNEL = "stable"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,79 @@
|
||||
import socket
|
||||
import threading
|
||||
import time
|
||||
import traceback
|
||||
|
||||
|
||||
BACKEND_HOST = "127.0.0.1"
|
||||
BACKEND_BIND_HOST = "0.0.0.0"
|
||||
BACKEND_PORT = 8000
|
||||
_backend_thread = None
|
||||
_backend_error = None
|
||||
|
||||
|
||||
def is_port_open(host: str = BACKEND_HOST, port: int = BACKEND_PORT) -> bool:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
s.settimeout(0.5)
|
||||
try:
|
||||
s.connect((host, port))
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def _run_backend_in_thread() -> None:
|
||||
global _backend_error
|
||||
try:
|
||||
import uvicorn
|
||||
import backend_main
|
||||
|
||||
app = getattr(backend_main, "app", None)
|
||||
if app is None:
|
||||
raise RuntimeError("backend_main.app wurde nicht gefunden.")
|
||||
|
||||
config = uvicorn.Config(
|
||||
app=app,
|
||||
host=BACKEND_BIND_HOST,
|
||||
port=BACKEND_PORT,
|
||||
log_level="info",
|
||||
)
|
||||
server = uvicorn.Server(config)
|
||||
server.run()
|
||||
except Exception:
|
||||
_backend_error = traceback.format_exc()
|
||||
|
||||
|
||||
def start_backend(timeout_seconds: float = 20.0) -> bool:
|
||||
global _backend_thread
|
||||
|
||||
if is_port_open():
|
||||
return True
|
||||
|
||||
if _backend_thread is None or not _backend_thread.is_alive():
|
||||
_backend_thread = threading.Thread(
|
||||
target=_run_backend_in_thread,
|
||||
name="aza-local-backend",
|
||||
daemon=True,
|
||||
)
|
||||
_backend_thread.start()
|
||||
|
||||
deadline = time.time() + timeout_seconds
|
||||
while time.time() < deadline:
|
||||
if is_port_open():
|
||||
return True
|
||||
if _backend_error:
|
||||
return False
|
||||
time.sleep(0.25)
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def get_backend_error() -> str:
|
||||
return _backend_error or ""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
ok = start_backend()
|
||||
print("backend_started:", ok)
|
||||
if not ok and _backend_error:
|
||||
print(_backend_error)
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": "1.2.1",
|
||||
"build": "20260523_224645",
|
||||
"channel": "stable",
|
||||
"app": "AZA Desktop"
|
||||
}
|
||||
Reference in New Issue
Block a user