
    该jٙ                     "   d dl mZmZmZ d dlZd dlmZ  ee      Zdddddd	d
ddddddd	dddddddd	d
ddddddddddd d!d"d#d$d%d&d'd(d)d*d+dd'd,d-d.d/d0d1d2d3d	d4d5d6d7d8d9d:d	d;d<d=d>d?d@dAdBd$dCd<dDdEdFdGddHdId$dJdKg
Z	dLdMdNdOdPdQdRdSdTdUi dVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}dSd~dUi dVddXddZdd\dd^dd`ddbdddddfddhddjddlddnddpddrddtddvddd"dddddddUi dVddXddZdd\dd^dd`ddbdddddfddhddjddlddnddpddrddtddvddddddddddUi dVddXddZdd\dd^dd`ddbdddddfddhddjddlddnddpddrddtddvdddddddd|ddUi dVdǓdXdȓdZdɓd\dʓd^d˓d`d̓dbd͓dddΓdfdϓdhdГdjdѓdldғdndӓdpddrdԓdtddvddddddddSddUi dvddddddddddUi dvddddddddSddUi dvddddd{d|d}dSddUi dvddddddd}dddUi dvdddddd|d}dddUi dvgZ
g dZe
j                  d         ddddddddd	d
ddZ ed      Zd Zddddddddddg ddddddddd d!d"d#g d$dgZd% Zd&Zej'                  d'      d(        Zej'                  d)      d*        Zd+Zd,Zej'                  d-      d.        Zej'                  d/      d0        Zed1k(  rej5                  d2d3d45       yy(6      )Flaskjsonifyrender_template_stringN)PathyoutubezYouTube Researchz:Video-Datenbank & KI-Analyse. Transkripte, Skills, Filter.u   📊z+https://youtube.agentsolutions-mallorca.comsystemdzyoutube-research.service)idnamedesciconurlstatus_typeservicezcontent-extractionzYouTube ExtractionzQInhalte extrahieren, bewerten, filtern und priorisieren. (geschuetzt, Basic Auth)u   🗂️z6https://content-extraction.agentsolutions-mallorca.comzcontent-extraction.servicez
youtube-lmz
YouTube LMzTVerifizierte Wissensaufbereitung, Lernstruktur und Audio-Skripte aus YouTube-Videos.u   🎧z6https://youtube.agentsolutions-mallorca.com/youtube-lmleadszLead Enginez6B2B Lead Enrichment & Dashboard. Kampagnen-Verwaltung.u   🎯z)https://leads.agentsolutions-mallorca.comdockerzlead-engine)r	   r
   r   r   r   r   	containertelefonzTelefon Agentz7Twilio IVR + KI-Sprachassistent fuer eingehende Anrufe.u   ☎z+https://telefon.agentsolutions-mallorca.comstaticzin Entwicklung)r	   r
   r   r   r   r   status_valueventoVentouX   WhatsApp-Empfangsassistent. Erkennt Kunden, führt Erstgespräch, bereitet Rückruf vor.u   💬z.https://vento.agentsolutions-mallorca.com/docsz3https://vento.agentsolutions-mallorca.com/customers)r	   r
   r   r   r   r   r   db_urlsolarzSolar-Wirtschaftlichkeits-AppuD   Photovoltaik, Eigenverbrauch, Förderung und Amortisation berechnen.u   ☀️z)https://solar.agentsolutions-mallorca.comz3https://solar.agentsolutions-mallorca.com/admin/vipz solar-wirtschaftlichkeit.service)r	   r
   r   r   r   vip_urlr   r   zsma-masu   Social Media Agent – MASur   Mallorca Air Services / Lüftungsprofi. Radar, Content Queue und Publishing für Lüftung, Feuchte und Immobilien.u   📡zUhttps://sma-mas.agentsolutions-mallorca.com/cockpit?days=1&sort=op_priority&tab=radarzsma-core-api.servicesma)r	   r
   r   r   r   r   r   groupzsma-asolu   Social Media Agent – ASOud   Agent Solutions. KI-Unternehmensberatung, individuelle Speziallösungen, Automatisierung und Agents.u   🧠z,https://sma-asol.agentsolutions-mallorca.compreview)r	   r
   r   r   r   r   r   r   donnaDonnazLLokale Windows-Assistentin (Electron). Aktueller Release: 1.1.2-free-models.z4https://agentsolutions-mallorca.com/downloads/donna/locallokal)r	   r
   r   r   r   locationr   r   sop-agent-systemu   SOP → Agent-Systemu   🧭uW   Wiederholbare Abläufe in versionierte, kontrollierbare Agenten-Workflows überführen.u	   23–48 hu   schnell · Pilot vorhandenz9,0/10hochu   Setup + 150–500 €/Monat)Aufbau	Umsetzung	Potenzial	Konfidenzu   ErlösProjektbeschreibungu{   Plan: Aus einer geprüften SOP wird ein Agent-/Skill-Entwurf mit klaren Eingaben, Ausgaben, Eskalationen und Human-Handoff.	ZielkundeuT   Plan: Unternehmen mit wiederkehrenden Kundenanfragen und dokumentierbaren Abläufen.Kundenproblemu\   Plan: Wissen ist verteilt, Abläufe sind personenabhängig und Übergaben nicht einheitlich.Anforderungsprofilur   Plan: stabile SOP, freigegebene Datenquellen, Verantwortliche für Abnahme, Datenschutz- und Berechtigungskonzept.zTechnischer Aufbauu   Plan: versionierte SOP → deterministische Validierung → Agent-/Skill-Ausgabe → Audit → Human-Review-Queue; produktive Kanaladapter nur nach Freigabe.EntwicklungsaufwandzPlanwert: Discovery, Modellierung, Tests, Sicherheitsgrenzen und read-only Shadow-Run je Anwendungsfall; Aufwand wird nach Scope kalkuliert.zLaufender AufwanduS   Planwert: Pflege von SOP/Versionen, Testfällen, Monitoring und fachlicher Abnahme.VertragsmodellezgPlan: einmalige Konzeption/Einrichtung plus laufende Wartung; optionale Weiterentwicklung nach Aufwand.ErtragspotenzialuJ   Planwert: projekt- und betreuungsabhängig; keine Ist-Umsätze hinterlegt.u%   Mögliche Kundenzahl / Marktpotenzialum   Plan: branchenübergreifend für Prozesse mit wiederkehrenden Anfragen; belastbare Marktzahl noch zu erheben.zKundengewinnung / AkquisewegezgPlan: bestehende Beratungskontakte, Prozess-Workshops, Referenz-Demos und zielgerichtete B2B-Ansprache.zRisiken und Folgenu   Fehlende SOP-Qualität, Datenschutz, falsche Klassifikation oder unklare Freigaben können zu Fehlübergaben führen; Human-Gate bleibt erforderlich.u   Cross-Selling-Möglichkeitenz`Plan: Lead-Aufnahme, Prozessautomatisierung, Wissensaufbereitung und betreute Agenten-Workflows.zAktueller StatuszdVerifiziert: Pilotentwurf ASI-LEAD-INTAKE v1.0.0; lokaler Verifier PASS. Nicht produktiv integriert.u   Nächste SchrittezRead-only Shadow-Adapter mit synthetischen Fixtures, danach fachliche/Datenschutz-/Systemowner-Abnahme und erst dann begrenzter Kanalpilot.z/Vorhandene Demos / Referenzen / Agenten / Toolsu   Real vorhanden: /opt/struktur/agent-solutions-cockpit/pilot-lead-intake-v1 mit SOP, Spezifikation, 12 synthetischen Testfällen, verify_pilot.py und Verifikationsbericht. Keine produktiven Kanaladapter oder CRM-Schreibzugriffe.)r	   r
   r   r   metricsfieldsprozess-human-loopz*Prozessautomatisierung + Human-in-the-loopu   🔁uI   Automatisierung mit definierten Prüf-, Freigabe- und Eskalationspunkten.u	   40–80 hmittelz8,7/10u   Projekt + 200–1.000 €/Monatz{Plan: Wiederkehrende Prozessschritte automatisieren, kritische Entscheidungen aber nachvollziehbar einem Menschen vorlegen.zPPlan: Teams mit hohem manuellen Bearbeitungsanteil und klaren Freigabepflichten.z^Plan: Durchlaufzeiten und Fehler steigen, wenn Automatisierung ohne Kontrolle eingesetzt wird.z`Plan: Prozessdiagramm, Rollen/RBAC, Freigabekriterien, Datenminimierung und Audit-Anforderungen.uh   Plan: Trigger → Agent/Workflow → Validierung → Human-Queue → freigegebene Folgeaktion → Audit.ur   Planwert: Prozessaufnahme, Integrationen, Rollenmodell, Testfälle und Betriebskonzept; nach Schnittstellenumfang.uT   Planwert: Monitoring, Regelpflege, Review-Queue und Anpassung an Prozessänderungen.uU   Plan: Implementierungsprojekt, Retainer für Betrieb oder modulare Weiterentwicklung.ul   Planwert: abhängig von Prozesskritikalität, Einsparung und Integrationsumfang; keine Ist-Werte hinterlegt.zNPlan: viele KMU-Prozesse geeignet; konkrete Segmentierung und Marktzahl offen.zWPlan: Prozessanalyse-Workshop, bestehende Automationsprojekte, Partner und Fallstudien.u   Zu breite Berechtigungen, fehlende Eskalationen oder schlechte Datenqualität können Fehlaktionen verursachen; Start read-only.uA   Plan: SOP→Agent, Lead-Agent, Skill-Library und Content-Service.zCPlanphase; kein verifizierter produktiver Projektstatus hinterlegt.um   Einen abgegrenzten Prozess auswählen, Risiko-/Tool-Matrix erstellen und synthetischen Shadow-Run definieren.zRKeine projektspezifische Demo oder Kundenreferenz als real verifiziert hinterlegt.ai-rezeptionist-lead-agentzAI-Rezeptionist / Lead-Agentu`   Eingehende Anfragen strukturiert erfassen, vorsichtig klassifizieren und an Menschen übergeben.u   30–60 h Standardu   mittel · Vorarbeit vorhandenz8,6/10zmittel-hochu   Setup + 250–800 €/Monatul   Plan: Digitaler Erstkontakt für Telefon, Web oder Messaging mit sicherer Übergabe statt autonomer Zusagen.zgPlan: Unternehmen mit vielen eingehenden Anfragen und verpassten oder uneinheitlich bearbeiteten Leads.ue   Plan: Anfragen gehen verloren, Pflichtdaten fehlen und Mitarbeitende müssen wiederholt vorsortieren.uj   Plan: freigegebene Kanäle, Antwortleitfäden, Eskalationsregeln, Human-Queue, Datenschutz und Monitoring.u   Plan: Kanaladapter → Intake/Intent → Pflichtfeld- und Sicherheitsprüfung → Handoff → menschliche Bearbeitung; keine Zusagen ohne Freigabe.uL   Planwert: je Kanal und Integration; inklusive Testfälle, Audit und Abnahme.zPPlanwert: Dialog-/Regelpflege, Queue-Review, Monitoring und Datenschutzprozesse.uf   Plan: Einrichtung plus monatliche Betreuung oder nutzungs-/volumenabhängiges Modell nach Kalkulation.uY   Planwert: abhängig von Kanalvolumen und Betreuungsumfang; keine Ist-Umsätze hinterlegt.uQ   Plan: serviceintensive KMU und lokale Dienstleister; konkrete Marktgröße offen.z[Plan: Demo mit synthetischen Anfragen, lokale B2B-Ansprache, Partner und Prozess-Workshops.uz   Halluzinierte Zusagen, Datenschutzverstöße und falsche Eskalation; Human-Review und externe_action_taken=false im Pilot.zoPlan: SOP-Modellierung, Prozessautomatisierung, CRM-Integration nach Freigabe und Content-/Landingpage-Service.zVerifiziert: ASI-LEAD-INTAKE ist ein lokaler Draft-only-Pilot; keine produktive VENTO-Route, kein Versand, keine CRM-Schreibaktion.uq   Read-only Shadow-Adapter, Owner-Abnahmen für RBAC/Aufbewahrung/Monitoring, danach genau ein freigegebener Kanal.u   Real vorhanden: Pilotartefakte unter /opt/struktur/agent-solutions-cockpit/pilot-lead-intake-v1; 12 synthetische Testfälle, lokaler Verifier PASS.skill-library-orchestrationz&Skill-Library + Agenten-Orchestrierungu   🧩uY   Wiederverwendbare Skills, Rollen und Routing-Regeln für mehrere Agenten systematisieren.u
   80–200 hu   aufwendig · parallelz8,0/10zindirekter Umsatzhebelui   Plan: Skills versionieren, Zuständigkeiten trennen und Aufgaben kontrolliert an passende Agenten routen.uM   Plan: Organisationen mit mehreren Automationen, Agenten oder Wissensdomänen.ud   Plan: Einzelintegrationen wachsen unübersichtlich; Wissen und Zuständigkeiten sind schwer wartbar.zjPlan: Skill-Verantwortliche, Namens-/Versionskonventionen, Routing-Regeln, Berechtigungen und Testkatalog.us   Plan: Skill-Registry → Routing/Orchestrierung → spezialisierte Agenten → Ergebnisprüfung → Audit/Feedback.u[   Planwert: Architektur, Migration und Testabdeckung abhängig von Agenten- und Skill-Anzahl.uT   Planwert: Versionierung, Qualitätsprüfung, Routing-Hygiene und Betriebsmonitoring.zEPlan: Architekturprojekt plus laufender Governance-/Betriebsretainer.uP   Planwert: skalierbar über wiederverwendbare Module; keine Ist-Werte hinterlegt.zVPlan: vor allem wachsende Automations- und Wissensorganisationen; konkrete Zahl offen.zOPlan: Architektur-Audit, Orchestrierungsworkshop, technische Demos und Partner.up   Fehlrouting, unklare Ownership und zu viele Berechtigungen; Änderungen müssen versioniert und reversibel sein.z@Plan: alle vier weiteren Projekte als modulare Skills/Workflows.zGPlanphase; kein projektspezifischer Fertigstellungsnachweis hinterlegt.zqSkill-/Routing-Inventar erstellen, Minimal-Registry definieren und read-only Testlauf mit synthetischen Aufgaben.zZKeine projektspezifische Kundenreferenz oder fertige Demo als real verifiziert hinterlegt.content-landingpage-servicezContent-/Landingpage-Serviceu   ✍z\Recherche, Struktur und Erstellung von Content und Landingpages mit kontrollierter Freigabe.u	   20–50 hschnellz7,7/10u   300–1.000 €/Monatuk   Plan: Briefing, Recherche, Content-Produktion und Landingpage-Struktur als wiederholbaren Service bündeln.ub   Plan: KMU und Agenturen mit regelmäßigem Bedarf an qualifiziertem Content und Conversion-Seiten.zjPlan: Inhalte entstehen langsam, uneinheitlich oder ohne nachvollziehbaren Recherche- und Freigabeprozess.ziPlan: Markenleitfaden, Zielgruppe, Quellen-/Faktenprozess, CMS-Zugang nur mit Freigabe und klare Abnahme.uv   Plan: Briefing → Recherche/Quellen → Entwurf → Qualitäts-/Faktencheck → Human-Freigabe → Veröffentlichung.zMPlanwert: Templates, Content-Workflow und optionale CMS-Anbindung nach Scope.zRPlanwert: Redaktionsplanung, Reviews, Aktualisierungen und Performance-Auswertung.zJPlan: Einzelprojekt, Content-Kontingent oder laufender Redaktionsretainer.uP   Planwert: abhängig von Output, Kanal und Betreuung; keine Ist-Werte hinterlegt.uQ   Plan: branchenübergreifender Bedarf; belastbare Marktgröße noch zu validieren.zYPlan: Landingpage-Audit, Content-Workshop, bestehende Kontakte, Partner und eigene Demos.ur   Falsche Fakten, Markenabweichungen, Urheberrechts- und Freigaberisiken; Veröffentlichung erst nach Human-Abnahme.uJ   Plan: Wissenspipeline, SOP→Agent, Lead-Agent und Prozessautomatisierung.zbStandardbriefing, Freigabegates und ein synthetisches Beispielprojekt als interne Demo definieren.ki-wissens-onboardingzKI-Wissens- & Onboarding-Systemu   ◈u]   Unternehmenswissen sichern, quellenbasiert zugänglich machen und Einarbeitung beschleunigen.u	   30–70 hu!   mittel · Infrastruktur vorhandenz9,1/10u   Setup + 200–700 €/Monatprocurement-savings-auditz#Beschaffungs-Audit / Savings Finderu   ◎u   Einstiegsangebot: Einkaufs- und Bestandsdaten prüfen, wirtschaftliche Hebel sichtbar machen und das passende Folgeprojekt ableiten.u   8–20 hu    sehr schnell · Einstiegsangebotz8,9/10u   Audit 500–1.500 €inventory-replenishment-agentzBestands- & Nachbestell-Agentu   ▣uP   Bestand und Verbrauch überwachen und Nachbestellungen kontrolliert vorbereiten.u	   35–70 hu   mittel · gute Standardisierungz8,8/10u   Setup + 250–900 €/Monatsupplier-risk-monitoring-agentzLieferanten-Risiko-Agentu   ⚠uS   Lieferanten auf Ausfall-, Preis-, Leistungs- und externe Risikosignale überwachen.u   Setup + 300–1.000 €/Monatspend-cost-analysis-agentzSpend- & Kostenanalyse-Agentu   ΣzXEinkaufsdaten analysieren und Preisabweichungen sowie Einsparpotenziale sichtbar machen.u	   25–50 hu   schnell–mittelu   Analyse + 150–600 €/Monatrfq-offer-comparison-agentzRFQ- & Angebotsvergleich-Agentu   ≋z]Lieferantenanfragen und Angebote strukturiert vergleichen und Entscheidungsvorlagen erzeugen.u	   30–60 h)r8   r#   r2   r4   r5   r6   c                 L    | d   t         v rt         j                  | d         S dS )Nr	   i  )PRIORITY_ORDERindexps    '/opt/struktur/projects-dashboard/app.py<lambda>rD      s&    agQ_F_^%9%9!D'%B eh     )keyzSOP-Agent-System.mdz+Prozessautomatisierung-Human-in-the-loop.mdzAI-Rezeptionist-Lead-Agent.mdz'Skill-Library-Agenten-Orchestrierung.mdzContent-Landingpage-Service.mdzKI-Wissens-Onboarding-System.mdz$Beschaffungs-Audit-Savings-Finder.mdzBestands-Nachbestell-Agent.mdzLieferanten-Risiko-Agent.mdzSpend-Kostenanalyse-Agent.mdzRFQ-Angebotsvergleich-Agent.md)r#   r2   r4   r5   r6   r8   r9   r:   r;   r<   r=   z2/opt/obsidian-vault/Agent-Solutions/Kundenprojektec                    t         j                  |       }|si d fS t        |z  }|j                         si t	        |      fS |j                  d      }i d g }}}|j                         D ]a  }|j                  d      r:|r"dj                  |      j                         ||<   |dd  j                         g }}N|Q|j                  |       c |r"dj                  |      j                         ||<   |t	        |      fS )Nzutf-8)encodingz## 
   )CUSTOMER_PROJECT_DOSSIERSgetCUSTOMER_PROJECT_VAULT_DIRexistsstr	read_text
splitlines
startswithjoinstripappend)
project_idfilenamepathtextr1   currentbuflines           rC   load_customer_project_fieldsr]      s    (,,Z8HBH_%0D;;=SY.>>7>+DtRSGF! ??5!$))C.*>*>*@w8>>+RSG JJt $))C."6"6"8w3t9rE   businesszSuchrichtung: BusinessBusinessa  Recherche nach konkreten, verkaufbaren KI- und Automatisierungsleistungen fuer kleine und mittlere Unternehmen. Ziel ist es, wiederkehrende Kundenprobleme, umsetzbare Agenten-/Workflow-Ideen sowie standardisierbare Angebote mit realistischem Ertragspotenzial zu identifizieren.zNeueste importierte zuerstz20 Videos ausgewertetz19 verwertbarz1 Transkript fehltu   2 Batches · 2026-09-08u5   KI-Aktualität: max. 90 Tage · Fallback bis 120 Tage)r	   titlekeywordspurposesort	evaluatedusablemissingbatchrecencyproject_idszeinkauf-bestandzSuchrichtung: Einkauf & Bestandu<   Einkauf · Beschaffung · Bestand · Lieferanten · Sourcingu   Recherche nach klar abgrenzbaren KI- und Automatisierungsleistungen rund um Einkauf, Lieferanten, Kostenanalyse und Bestandssteuerung. Überschneidungen mit den allgemeinen Business-Projekten werden vermieden.u    Neueste Veröffentlichung zuerstz/1 direkter YouTube-Treffer im aktuellen Bestandu)   1 verwertbar · externe Validierung starkz YouTube-Abdeckung derzeit geringu   1 Batch · 2026-09-08u:   YouTube: max. 90 Tage · externe Quellen: Schwerpunkt 2026)r9   r:   r;   r<   r=   c                    | j                  d      }|dk(  r| j                  dd      S |dk(  rS| j                  d      }	 t        j                  dddd	|gd
d
d      }|j                  j	                         }|dk(  rdS dS |dk(  rO| j                  d      }	 t        j                  dd|gd
d
d      }|j                  j	                         dk(  rdS dS y# t
        $ r Y yw xY w# t
        $ r Y yw xY w)Nr   r   r   pendingr   r   inspectz--formatz{{.State.Status}}T   )capture_outputrY   timeoutrunningonlineoffliner   r   	systemctlz	is-activeactive)rL   
subprocessrunstdoutrT   	Exception)projectr   r   resultstater   s         rC   
get_statusr|      s   ++m,Kh{{>955hKK,	
	^^9j2EyQ#	F MM'')E$	18@y@ i++i(		^^k73#	F  &}}224@8OiO !  		  		s0    >C ?C :C% C% 	C"!C"%	C10C1u  <!DOCTYPE html><html lang="de"><head><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Projekte</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: #0f1117; color: #e2e8f0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; min-height: 100vh; }
header { padding: 2rem 3rem; border-bottom: 1px solid #1e2330; display: flex; justify-content: space-between; align-items: center; }
header h1 { font-size: 1.5rem; font-weight: 600; color: #fff; }
header span { font-size: 0.85rem; color: #fff; }
header a { font-size: 0.8rem; color: #3b82f6; text-decoration: none; }
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem; padding: 3rem; }
.card { background: #161b27; border: 1px solid #1e2330; border-radius: 12px; padding: 1.5rem; }
.card-header { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 1rem; }
.card-icon { font-size: 2rem; }
.card-icon svg { display: block; width: 2.2rem; height: 2.2rem; }
.badge { font-size: 0.7rem; padding: 0.25rem 0.7rem; border-radius: 99px; font-weight: 600; }
.badge.online { background: #1a3a2a; color: #4ade80; border: 1px solid #166534; }
.badge.offline { background: #3a1a1a; color: #f87171; border: 1px solid #7f1d1d; }
.badge.pending { background: #2a2a2a; color: #fff; border: 1px solid #334155; }
.badge.lokal { background: #1e2a3a; color: #818cf8; border: 1px solid #3730a3; }
.badge.preview { background: #2a2440; color: #c4b5fd; border: 1px solid #6d28d9; }
.section-title { font-size: 0.85rem; font-weight: 700; color: #fff; text-transform: uppercase; letter-spacing: 1.5px; padding: 0 3rem; margin-top: 1.5rem; }
.card-title { font-size: 1.1rem; font-weight: 600; color: #fff; margin-bottom: 0.4rem; }
.card-desc { font-size: 0.85rem; color: #fff; line-height: 1.5; margin-bottom: 1.2rem; }
.card-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; }
.btn { font-size: 0.75rem; padding: 0.4rem 0.9rem; border-radius: 6px; border: none; cursor: pointer; font-weight: 500; }
.btn-open { background: #1e3a5f; color: #60a5fa; }
.btn-restart { background: #1e3a2a; color: #4ade80; }
.btn-stop { background: #3a1e1e; color: #f87171; }
.btn-start { background: #1a3a2a; color: #4ade80; }
footer { text-align: center; padding: 2rem; color: #334155; font-size: 0.8rem; }
</style></head><body>
{% macro project_icon(p) -%}
{% if p.id == 'youtube' %}<svg viewBox="0 0 48 48" role="img" aria-label="YouTube Research" data-icon="youtube-research"><rect x="2" y="8" width="29" height="22" rx="6" fill="#ff0033"/><path d="M13 13l10 6-10 6z" fill="#fff"/><circle cx="35" cy="29" r="7" fill="none" stroke="#e2e8f0" stroke-width="3"/><path d="M40 34l5 5" stroke="#e2e8f0" stroke-width="3" stroke-linecap="round"/></svg>
{% elif p.id == 'youtube-lm' %}<svg viewBox="0 0 48 48" role="img" aria-label="YouTube LM" data-icon="youtube-lm"><rect x="2" y="8" width="29" height="22" rx="6" fill="#ff0033"/><path d="M13 13l10 6-10 6z" fill="#fff"/><path d="M34 18v12M39 14v20M44 19v10" stroke="#e2e8f0" stroke-width="3" stroke-linecap="round"/></svg>
{% elif p.id == 'content-extraction' %}<svg viewBox="0 0 48 48" role="img" aria-label="YouTube Extraction" data-icon="youtube-extraction"><rect x="2" y="8" width="29" height="22" rx="6" fill="#ff0033"/><path d="M13 13l10 6-10 6z" fill="#fff"/><path d="M35 13h7l4 4v19a3 3 0 0 1-3 3H35a3 3 0 0 1-3-3V16a3 3 0 0 1 3-3z" fill="none" stroke="#e2e8f0" stroke-width="2.5"/><path d="M42 13v5h4M36 24h7M36 29h7" stroke="#e2e8f0" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
{% else %}{{ p.icon }}{% endif %}
{%- endmacro %}
<header><div><h1>Projekte</h1><span>Projekte VPS</span></div>
<a href="https://agentsolutions-mallorca.com" style="font-size:0.85rem;color:#3b82f6;text-decoration:none;border:1px solid #1e3a5f;padding:0.4rem 1rem;border-radius:8px;">&#8592; Agent Solutions</a></header>
<div class="section-title">Social Media Agents</div>
<div class="grid" id="grid-sma">
{% for p in projects %}{% if p.group == 'sma' %}
<div class="card" id="card-{{p.id}}">
<div class="card-header"><div class="card-icon">{{ project_icon(p) }}</div>
<span class="badge pending" id="badge-{{p.id}}">...</span></div>
<div class="card-title">{{p.name}}</div>
<div class="card-desc">{{p.desc}}</div>
<div class="card-actions">
{% if p.url %}<button class="btn btn-open" onclick='openProjectWindow({{ p.url|tojson }})'>&#214;ffnen</button>{% endif %}
</div></div>
{% endif %}{% endfor %}
</div>
<div class="section-title">Weitere VPS-Projekte</div>
<div class="grid" id="grid">
{% for p in projects %}{% if p.location != 'local' and p.group != 'sma' %}
<div class="card" id="card-{{p.id}}">
<div class="card-header"><div class="card-icon">{{ project_icon(p) }}</div>
<span class="badge pending" id="badge-{{p.id}}">...</span></div>
<div class="card-title">{{p.name}}</div>
<div class="card-desc">{{p.desc}}</div>
<div class="card-actions">
{% if p.url %}<button class="btn btn-open" onclick='openProjectWindow({{ p.url|tojson }})'>&#214;ffnen</button>{% endif %}{% if p.vip_url %}<button class="btn" style="background:#2a2440;color:#c4b5fd" onclick='openProjectWindow({{ p.vip_url|tojson }})'>VIP-Zugänge</button>{% endif %}{% if p.db_url %}<button class="btn" style="background:#1e2a3a;color:#818cf8" onclick='openProjectWindow({{ p.db_url|tojson }})'>Kunden DB</button>{% endif %}
</div></div>
{% endif %}{% endfor %}
</div>
<div class="section-title">Lokale Projekte</div>
<div class="grid" id="grid-local">
{% for p in projects %}{% if p.location == 'local' %}
<div class="card" id="card-{{p.id}}">
<div class="card-header"><div class="card-icon">{{ project_icon(p) }}</div>
<span class="badge lokal" id="badge-{{p.id}}">lokal</span></div>
<div class="card-title">{{p.name}}</div>
<div class="card-desc">{{p.desc}}</div>
<div class="card-actions">
{% if p.url %}<a href="{{p.url}}" target="_blank"><button class="btn btn-open">&#214;ffnen</button></a>{% endif %}
</div></div>
{% endif %}{% endfor %}
</div>
<footer>Agent Solutions · Projekte · VPS IONOS 31.70.68.228</footer>
<script>
function openProjectWindow(url) {
  window.open(
    url,
    "_blank",
    "width=1400,height=900,resizable=yes,scrollbars=yes,noopener"
  );
}

function updateStatus() {
  fetch("/api/status").then(r=>r.json()).then(data => {
    data.forEach(s => {
      const b = document.getElementById("badge-"+s.id);
      b.textContent = s.status;
      const cls =
        s.status === "online" ? "online" :
        s.status === "offline" ? "offline" :
        s.status === "lokal" ? "lokal" :
        s.status === "preview" ? "preview" :
        "pending";
      b.className = "badge " + cls;
    });
  });
}
updateStatus();
setInterval(updateStatus, 15000);
</script></body></html>/c                  ,    t        t        t              S )N)projects)r   HTMLPROJECTS rE   rC   r@   r@     s    !$::rE   z/api/statusc            	      d    t        t        D  cg c]  } | d   t        |       d c}       S c c} w )Nr	   )r	   status)r   r   r|   rA   s    rC   r   r     s(    hO1T7jm<OPPOs   -u  <!DOCTYPE html><html lang="de"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Kundenprojekte</title><style>
*{box-sizing:border-box}body{margin:0;background:#0f1117;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}header{padding:2rem 3rem;border-bottom:1px solid #1e2330;display:flex;justify-content:space-between;align-items:center}h1{margin:0;color:#fff;font-size:1.5rem}header span{color:#fff;font-size:.85rem}.back{color:#60a5fa;text-decoration:none;border:1px solid #1e3a5f;padding:.4rem 1rem;border-radius:8px}.wrap{padding:2.5rem 3rem;max-width:1400px;margin:auto}.intro{color:#fff;line-height:1.6;margin:0 0 1.5rem}.direction{margin:0 0 3rem;border:1px solid #263044;border-radius:14px;padding:1.25rem;background:#111621}.direction h2{color:#fff;font-size:1.45rem;margin:0 0 .9rem;padding:.85rem 1rem;background:#1a2231;border-left:5px solid #3b82f6;border-radius:8px;letter-spacing:.01em}.direction-purpose{max-width:1050px;color:#fff;font-size:.84rem;line-height:1.55;margin:-.2rem 0 .85rem;padding:.75rem .9rem;background:#121722;border-left:3px solid #3b82f6;border-radius:6px}.direction-meta{display:flex;flex-wrap:wrap;gap:.5rem;margin:0 0 1rem}.direction-meta span{background:#161b27;border:1px solid #263044;border-radius:7px;color:#fff;font-size:.78rem;padding:.45rem .65rem}.table-head{display:grid;grid-template-columns:minmax(240px,1.45fr) minmax(190px,1.05fr) repeat(5,minmax(100px,.65fr)) auto;gap:.8rem;padding:0 .9rem .45rem;color:#fff;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.grid{display:flex;flex-direction:column;gap:.85rem}.card{background:#161b27;border:1px solid #1e2330;border-radius:12px;padding:1rem 1.15rem;display:grid;grid-template-columns:minmax(240px,1.45fr) minmax(190px,1.05fr) repeat(5,minmax(100px,.65fr)) auto;gap:.8rem;align-items:center}.segments{font-size:.76rem;line-height:1.45;color:#fff}.segment-value{display:block;color:#fff}.project-main{display:grid;grid-template-columns:auto 1fr;gap:.8rem;align-items:center}.icon{font-size:1.8rem}.title{font-size:1rem;font-weight:600;color:#fff;margin-bottom:.2rem}.desc{font-size:.78rem;color:#fff;line-height:1.4}.metrics{display:contents}.metric{background:#0f1420;border:1px solid #263044;border-radius:8px;padding:.55rem}.metric-label{display:block;color:#fff;font-size:.64rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.18rem}.metric-value{display:block;color:#fff;font-size:.78rem;font-weight:650;line-height:1.25}.plan-note{display:none}.btn{display:inline-block;margin:0;background:#1e3a5f;color:#60a5fa;border:0;border-radius:6px;padding:.45rem .9rem;text-decoration:none;font-size:.8rem;font-weight:600;white-space:nowrap}footer{text-align:center;padding:2rem;color:#fff;font-size:.8rem}@media(max-width:1000px){.table-head{display:none}.card{grid-template-columns:1fr 1fr}.project-main,.segments,.btn{grid-column:1/-1}}@media(max-width:700px){header,.wrap{padding-left:1.25rem;padding-right:1.25rem}.card{grid-template-columns:1fr}.metric{min-height:55px}}
</style></head><body><header><div><h1>Kundenprojekte</h1><span>Projekte · Lösungsangebote und Entwicklungsstände</span></div><a class="back" href="/">← Projekte</a></header><main class="wrap"><p class="intro">Übersicht der ausgearbeiteten Projektangebote. Planwerte sind ausdrücklich als Plan gekennzeichnet; Ist-Zustände werden nur bei verifizierten Artefakten ausgewiesen.</p>{% for direction in search_directions %}<section class="direction" id="search-direction-{{direction.id}}"><h2>{{direction.title}} · {{direction.project_ids|length}} Einträge</h2><div class="direction-purpose"><strong>Recherche-Zweck:</strong> {{direction.purpose}}</div><div class="direction-meta"><span>Suchbegriffe: {{direction.keywords}}</span><span>Sortierung: {{direction.sort}}</span><span>{{direction.evaluated}}</span><span>{{direction.usable}}</span><span>{{direction.missing}}</span><span>Batch: {{direction.batch}}</span><span>{{direction.recency}}</span></div><div class="table-head"><span>Projekt</span><span>Interessant für</span><span>Aufbau</span><span>Umsetzung</span><span>Potenzial</span><span>Konfidenz</span><span>Erlös</span><span>Details</span></div><div class="grid">{% for p in customer_projects %}{% if p.id in direction.project_ids %}<article class="card" id="project-card-{{p.id}}"><div class="project-main"><div class="icon">{{p.icon}}</div><div><div class="title">{{p.name}}</div><div class="desc">{{p.desc}}</div></div></div><div class="segments"><span class="segment-value">{{p.segments}}</span></div><div class="metrics">{% for label,value in p.metrics.items() %}<div class="metric"><span class="metric-label">{{label}}</span><span class="metric-value">{{value}}</span></div>{% endfor %}</div><div class="plan-note">Planwerte zur internen Bewertung</div><a class="btn" href="/kundenprojekte/{{p.id}}">Details</a></article>{% endif %}{% endfor %}</div></section>{% endfor %}</main><footer>Agent Solutions · Projekte</footer></body></html>u  <!DOCTYPE html><html lang="de"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{project.name}} · Kundenprojekte</title><style>
*{box-sizing:border-box}body{margin:0;background:#0f1117;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}header{padding:2rem 3rem;border-bottom:1px solid #1e2330;display:flex;justify-content:space-between;align-items:center;gap:1rem}h1{margin:0;color:#fff;font-size:1.45rem}.sub{color:#fff;font-size:.85rem;margin-top:.4rem}.back{color:#60a5fa;text-decoration:none;border:1px solid #1e3a5f;padding:.4rem 1rem;border-radius:8px}.wrap{padding:2.5rem 3rem;max-width:1050px;margin:auto}.hero{background:#161b27;border:1px solid #1e2330;border-radius:12px;padding:1.5rem;margin-bottom:1.25rem}.hero-icon{font-size:2.3rem}.hero p{color:#fff;line-height:1.6}.note{color:#fbbf24;font-size:.82rem}.details{display:grid;gap:.65rem}details{background:#161b27;border:1px solid #1e2330;border-radius:9px;padding:0 1rem}summary{cursor:pointer;padding:1rem 0;color:#fff;font-weight:600}details p{color:#fff;line-height:1.6;font-size:.9rem;margin:0 0 1rem;white-space:pre-line}footer{text-align:center;padding:2rem;color:#fff;font-size:.8rem}@media(max-width:700px){header,.wrap{padding-left:1.25rem;padding-right:1.25rem;align-items:flex-start}}
</style></head><body><header><div><h1>{{project.icon}} {{project.name}}</h1><div class="sub">Kundenprojekte · Detailansicht</div></div><a class="back" href="/kundenprojekte">← Kundenprojekte</a></header><main class="wrap"><section class="hero"><p>{{project.desc}}</p>{% if project.dossier_path %}<p style="font-size:.8rem;color:#fff"><strong>Wissensquelle:</strong> {{project.dossier_path}} · für Obsidian/Graphiti</p>{% endif %}<div class="note">Planwerte und offene Punkte sind gekennzeichnet. Keine nicht verifizierten Fertigstellungen oder Kundenreferenzen.</div></section><section class="details">{% for label,value in project.fields.items() %}<details{% if loop.first %} open{% endif %}><summary>{{label}}</summary><p>{{value}}</p></details>{% endfor %}</section></main><footer>Agent Solutions · Projekte</footer></body></html>z/kundenprojektec                      g } t         D ]D  }t        |      }t        |d         \  }}|j                  dd      |d<   | j	                  |       F t        t        | t              S )Nr	   u   Interessant für / Zielbranchen segments)customer_projectssearch_directions)CUSTOMER_PROJECTSdictr]   rL   rU   r   CUSTOMER_PROJECTS_INDEX_HTMLSEARCH_DIRECTIONS)r   sourcery   r1   _s        rC   kundenprojekter     sk    H# !V-gdm<q"JJ'HL
 	!
 "$"+ rE   z/kundenprojekte/<project_id>c                      t         fdt        D        d       }|yt        |      }t               \  }}|r||d<   ||d<   t	        t
        |      S )Nc              3   4   K   | ]  }|d    k(  s|  yw)r	   Nr   ).0itemrV   s     rC   	<genexpr>z'kundenprojekt_detail.<locals>.<genexpr>  s     ST$t*
:RDSs   )zProjekt nicht gefundeni  r1   dossier_path)ry   )nextr   r   r]   r   CUSTOMER_PROJECT_DETAIL_HTML)rV   ry   dossier_fieldsr   s   `   rC   kundenprojekt_detailr     s\    S%6SUYZG,7mG#?
#K NL**GN!">PPrE   __main__z	127.0.0.1i  F)hostportdebug)flaskr   r   r   ru   pathlibr   __name__appr   r   r?   rc   rK   rM   r]   r   r|   r   router@   r   r   r   r   r   rv   r   rE   rC   <module>r      sU
   8 8  Ho 0:v  AG  P}  NW  d~  )=  H[  en  wo  @I  Vr  s  8N  X^  g_  py  F`  aM3ku{  Ep  AI  Xe  fo7pz  Iv  GO  aq  rG  .H  RX  aQ  bj  y@  LA  B;  FL  V^  gR  _T  en  {]  ^:  Ey  CI  Ri  zC  Pf  qv  w;  Fl  v|  Es  DL  ^g  rw  xG-{  FO  XN  \c  t|  NU  V  !*@&i)8Tck  {A  Mj  k
!  $a
o
 {
 !  #W	

 !  #B
 "  $r
  !v
    I
  l
 4  6e
 ,  .W
 !  #z
 +  -O
   !G
    "o
  >  @e!
	0 #,Xbh[)xfl  yZ  [
!  $a
k
 }
 !  #E	

 !  #M
 "  $X
  !w
 v
   !O
 4  6F
 ,  .G
 !  #e
 +,o
  e
    "Q
  >  @T!
	0 +4R\ar2A`ow  GT  `}  ~
!  $R
  C
   E
 !  #O	

 !  #x
 "#q
  !s
    H
  {
 4  6I
 ,  .K
 !  #_
 +  -^
   !f
    "U
  >  @U!
	0 ,5]gmk*9P_g  wD  Ph  i
!  $O
h
   D
 !  #O	

 !  #X
 "  $A
  !w
 f
  r
 4  6N
 ,-~
 !  #U
 +,n
  i
    "U
  >  @\!
	0 ,5S]bn)	PXgo  |S  T
!  $Q
}
   J
 !  #N	

 !  #[
 "#r
  !u
 k
  r
 4  6I
 ,  .I
 !  #W
 +,x
  i
    "F
  >  @T!
	2 &/PZ_o)8[jr  BH  Tq  r	 *3Xbg W(7Yhp  @M  Yp  q  } .7V`eb)8Yhp  @F  Ro  p  |~ /8R\ae)xfl  yX  Y  eg *3Q[_j)8JYap}  Ji  j  vx +4T^co)xfs  @]  ^  jlaV r l   h  i .G"A#L#C>!G%D&C!?"B  ""VW * ) k,,!'*J r  2R g2F=5(O o :!FjX 3; ; =Q Q m  K    )*	Q +	Q zGG4uG5 rE   