**Neue Features:** - End Node Output Mode: AUTO vs. TEMPLATE - Jinja2 Template Editor mit Syntax-Beispiel - Placeholder Picker Modal (dynamische Node-Liste) - Template Serialisierung/Deserialisierung **Komponenten (NEU):** 1. EndNodeConfig.jsx (~150 Zeilen) - Output Mode Toggle (AUTO/TEMPLATE) - Template Textarea (monospace, 12 Zeilen) - Placeholder-Button (öffnet Picker) - Help-Text mit Beispiel-Syntax - Auto-Insert Default Template beim Wechsel zu TEMPLATE 2. PlaceholderPicker.jsx (~260 Zeilen) - Modal mit Suchfunktion - Dynamische Placeholder-Liste aus Workflow-Nodes - Kategorien: Global, Node Outputs, Signals - Click-to-Insert (schließt Modal automatisch) - Icons pro Node-Typ (🚀🤖⚡🔀🏁) **Integration:** - WorkflowEditorPage.jsx - EndNodeConfig im Config Panel (wenn type='end') - PlaceholderPicker State + Modal - handlePlaceholderSelect (fügt in Template ein) **Serialisierung:** - workflowSerializer.js - Serialize: output_mode + template für End Nodes - Deserialize: output_mode + template laden - Fallback: auto Mode wenn nicht gesetzt **Backend Status:** - ✅ Backend bereits fertig (execute_end_node() in workflow_executor.py) - ✅ Beide Modi (AUTO/TEMPLATE) funktionieren - ✅ Jinja2 Template Rendering implementiert **Part 3 Status:** Frontend Complete - ✅ End Node Config UI - ✅ Template Editor - ✅ Placeholder Picker - ⏸️ Testing ausstehend **Nächster Schritt:** Browser-Test auf dev.mitai.jinkendo.de Version: v0.9p Date: 2026-04-09 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
130 lines
5.8 KiB
Python
130 lines
5.8 KiB
Python
"""
|
||
Application Version Information
|
||
|
||
Semantic Versioning: MAJOR.MINOR.PATCH
|
||
- MAJOR: Breaking Change, DB-Migration inkompatibel
|
||
- MINOR: Neues Feature, neues Modul
|
||
- PATCH: Bugfix, kleine Änderung, Refactor
|
||
"""
|
||
|
||
APP_VERSION = "0.9p"
|
||
BUILD_DATE = "2026-04-09"
|
||
DB_SCHEMA_VERSION = "20260406e" # Migration 041
|
||
|
||
MODULE_VERSIONS = {
|
||
"auth": "1.2.0",
|
||
"profiles": "1.1.0",
|
||
"reference_values": "1.3.0",
|
||
"admin_reference_value_types": "1.0.0",
|
||
"weight": "1.0.3",
|
||
"circumference": "1.0.1",
|
||
"caliper": "1.0.1",
|
||
"activity": "1.2.0", # GET /activity: optional days= window + limit
|
||
"nutrition": "1.0.2",
|
||
"photos": "1.0.0",
|
||
"insights": "1.3.0",
|
||
"prompts": "1.1.0",
|
||
"admin": "1.4.0", # Widget × Feature-Zuordnung (Migration 041)
|
||
"stats": "1.0.1",
|
||
"exportdata": "1.1.0",
|
||
"importdata": "1.0.0",
|
||
"membership": "2.1.0",
|
||
"workflow": "0.6.0", # Phase 4: End Node Template Engine
|
||
"app_dashboard": "1.11.0", # Entitlements: DB-Override widget→features (AND), sonst Katalog
|
||
}
|
||
|
||
CHANGELOG = [
|
||
{
|
||
"version": "0.9n",
|
||
"date": "2026-04-06",
|
||
"changes": [
|
||
"Admin: Widgets × Features (Migration 041, AND-Gates, Hybrid mit widget_catalog)",
|
||
"Admin: Produkt-Dashboard-Systemstandard (Migration 040 system_config, API, UI)",
|
||
"Phase 4: End Node Template Engine",
|
||
"workflow_models.py: EndNodeOutputMode enum (AUTO, TEMPLATE)",
|
||
"workflow_executor.py: execute_end_node() with Jinja2 template rendering",
|
||
"Template Context: {{node_id.analysis_core}}, {{node_id.decision_signals.key}}",
|
||
"Conditional Rendering: {% if node_id %} for optional paths",
|
||
"AUTO Mode: Backward compatible concatenation of all analyses",
|
||
"TEMPLATE Mode: Custom Jinja2 templates with placeholder support",
|
||
]
|
||
},
|
||
{
|
||
"version": "0.9m",
|
||
"date": "2026-04-04",
|
||
"changes": [
|
||
"Phase 4: Join Nodes and Path Consolidation",
|
||
"join_evaluator.py: Join-Strategie-Evaluator (wait_all, wait_any, best_effort)",
|
||
"Path Status Collection: Sammelt incoming paths, prüft Ausführungsstatus",
|
||
"Result Consolidation: Merged analysis_cores + combined signals (mit node_id Präfix)",
|
||
"Skip-Handling: IGNORE_SKIPPED, USE_PLACEHOLDER, REQUIRE_MINIMUM",
|
||
"Partial Execution: Korrekte Behandlung von SKIPPED/FAILED Pfaden",
|
||
"workflow_executor.py: execute_join_node() Implementation",
|
||
"NodeExecutionState: List[NormalizedSignal] korrekt konvertiert zu Dict",
|
||
"Unit-Tests Phase 4: 18 Tests für Join Nodes (alle passing)",
|
||
"Phase 2/3 Backward Compatibility: 31 Tests (alle passing)",
|
||
]
|
||
},
|
||
{
|
||
"version": "0.9l",
|
||
"date": "2026-04-04",
|
||
"changes": [
|
||
"Phase 3: Logic Nodes + Conditional Branching",
|
||
"logic_evaluator.py: Deterministischer Logic Evaluator (EQ, NEQ, IN, GT, LT, CONTAINS, AND, OR, NOT)",
|
||
"workflow_executor.py: Conditional Branching via BFS-Traversierung mit Edge-Activation",
|
||
"execute_logic_node(): Bedingungen evaluieren, then/else Pfade aktivieren",
|
||
"Fallback-Strategien: CONSERVATIVE_SKIP, DEFAULT_PATH, UNCERTAINTY_PATH, DOCUMENT_ONLY",
|
||
"workflow_models.py: CONTAINS Operator hinzugefügt",
|
||
"Unit-Tests Phase 3: 20 Tests für Logic Evaluator (alle passing)",
|
||
"Phase 2 Backward Compatibility: 11 Tests aktualisiert (alle passing)",
|
||
]
|
||
},
|
||
{
|
||
"version": "0.9k",
|
||
"date": "2026-04-03",
|
||
"changes": [
|
||
"Phase 2: Normalisierung + Workflow Executor",
|
||
"normalization_engine.py: Synonym-Mapping, 5 Statuswerte (valid, normalized, unclear, invalid, not_decidable)",
|
||
"workflow_executor.py: Sequenzielle Workflow-Ausführung, Node-State-Tracking, Ergebnis-Aggregation",
|
||
"Integration in prompt_executor.py: Dispatcher für type='workflow'",
|
||
"API-Router workflows.py: POST /workflows/{id}/execute, GET /workflows/executions/{id}",
|
||
"Unit-Tests Phase 2: 27 Tests (normalization_engine + workflow_executor)",
|
||
"Erweitert: workflow_models.py (NormalizedSignal, NodeExecutionState, ExecutionResult)",
|
||
]
|
||
},
|
||
{
|
||
"version": "0.9j",
|
||
"date": "2026-04-03",
|
||
"changes": [
|
||
"Phase 1: Fragenergänzung + Strukturierter Container",
|
||
"question_augmenter.py: Hybrid-Modell (Knotengebundene Fragen überschreiben Prompt-Defaults)",
|
||
"result_container_parser.py: Markdown-Sektionen (Analysekern, Entscheidungsanteil, Begründungsanker)",
|
||
"Integration in execute_base_prompt(): Fragenergänzung vor LLM-Call, Parsing nach LLM-Response",
|
||
"API-Router workflow_questions.py: CRUD für workflow_question_catalog",
|
||
"Unit-Tests Phase 1: 25 Tests (question_augmenter + result_container_parser)",
|
||
]
|
||
},
|
||
{
|
||
"version": "0.9i",
|
||
"date": "2026-04-03",
|
||
"changes": [
|
||
"Phase 0: Workflow Engine Foundation",
|
||
"DB-Migration 034: workflow_definitions, workflow_question_catalog, workflow_executions",
|
||
"Pydantic-Modelle für Workflow-Graph (WorkflowGraph, Node, Edge, Condition)",
|
||
"Graph-Parsing, Topologische Sortierung, DAG-Validierung",
|
||
"Dispatcher-Erweiterung: type='workflow' (Stub-Implementierung)",
|
||
"Unit-Tests für Phase 0 (Graph-Parsing, Zyklen-Erkennung, Erreichbarkeit)",
|
||
]
|
||
},
|
||
{
|
||
"version": "0.9h+",
|
||
"date": "2026-03-28",
|
||
"changes": [
|
||
"Phase 0c: Multi-Layer Data Architecture Complete",
|
||
"Data Layer Migration (97 Funktionen in 6 Modulen)",
|
||
"20 neue Chart Endpoints (E1-E5, A1-A8, R1-R5, C1-C4)",
|
||
"Single Source of Truth für Datenberechnungen",
|
||
]
|
||
},
|
||
]
|