This commit is contained in:
2026-05-28 18:58:38 +02:00
parent 641bb10479
commit 28f429885a
4950 changed files with 933414 additions and 666 deletions

View File

@@ -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
}

View File

@@ -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",
)

View File

@@ -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,
)

View File

@@ -0,0 +1,2 @@
APP_VERSION = "1.2.1"
APP_CHANNEL = "stable"

File diff suppressed because it is too large Load Diff

View File

@@ -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)

View File

@@ -0,0 +1,6 @@
{
"version": "1.2.1",
"build": "20260523_224645",
"channel": "stable",
"app": "AZA Desktop"
}