From 3bf15c4850644a22c2df881b54e4bd82e2331a8b Mon Sep 17 00:00:00 2001 From: sysops Date: Tue, 9 Jun 2026 12:56:59 +0000 Subject: [PATCH] =?UTF-8?q?SysOps:=20deploy-all=20=E2=80=94=202026-06-09?= =?UTF-8?q?=2012:56=20UTC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cockpit/app/routes/platform_live.py | 6 +- cockpit/app/services/briefing.py | 2 +- cockpit/app/services/platform_live.py | 6 +- cockpit/static/js/agent-avatars.js | 2 +- cockpit/templates/agents.html | 2 +- cockpit/templates/beurs.html | 2 +- docs/AGENTS.md | 26 +++++- docs/PLATFORM-AZ.md | 2 +- migrations/025_hr_agent_roles.sql | 127 ++++++++++++++++++++++++++ 9 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 migrations/025_hr_agent_roles.sql diff --git a/cockpit/app/routes/platform_live.py b/cockpit/app/routes/platform_live.py index 5f094e8..6a65e97 100644 --- a/cockpit/app/routes/platform_live.py +++ b/cockpit/app/routes/platform_live.py @@ -12,7 +12,7 @@ CHANNEL_ROUTES = { "marketing": "/marketing", "beurs": "/beurs", "agents": "/agents", - "hermes": "/hermes", + "hr": "/agents", "browser": "/browser", "documents": "/documents", "settings": "/settings", @@ -56,8 +56,8 @@ def _resolve_source(row: dict[str, Any]) -> dict[str, Any]: source_url = "/marketing" elif agent in ("wholesale_scraper", "retail_intel"): source_url = "/retail" - elif agent == "hermes": - source_url = "/hermes" + elif agent == "hr": + source_url = "/agents" internal_url = source_url if source_url.startswith("/") else None external_url = source_url if source_url and source_url.startswith("http") else None diff --git a/cockpit/app/services/briefing.py b/cockpit/app/services/briefing.py index 549a624..1bb11e5 100644 --- a/cockpit/app/services/briefing.py +++ b/cockpit/app/services/briefing.py @@ -470,7 +470,7 @@ async def stream_daily_briefing(): "agent_msg", "agent_mesh", agent, "agent", f"@{agent}: {ev.get('title') or ev.get('event_type')}", ) - for agent_key in ("bizdev", "finance", "sourcing", "halal", "packaging"): + for agent_key in ("bizdev", "finance", "sourcing", "halal", "packaging", "hr"): yield _briefing_step( "agent_msg", "agent_mesh", "herman", "agent", f"Herman → {agent_key}: briefing context gedeeld", diff --git a/cockpit/app/services/platform_live.py b/cockpit/app/services/platform_live.py index 5f094e8..6a65e97 100644 --- a/cockpit/app/services/platform_live.py +++ b/cockpit/app/services/platform_live.py @@ -12,7 +12,7 @@ CHANNEL_ROUTES = { "marketing": "/marketing", "beurs": "/beurs", "agents": "/agents", - "hermes": "/hermes", + "hr": "/agents", "browser": "/browser", "documents": "/documents", "settings": "/settings", @@ -56,8 +56,8 @@ def _resolve_source(row: dict[str, Any]) -> dict[str, Any]: source_url = "/marketing" elif agent in ("wholesale_scraper", "retail_intel"): source_url = "/retail" - elif agent == "hermes": - source_url = "/hermes" + elif agent == "hr": + source_url = "/agents" internal_url = source_url if source_url.startswith("/") else None external_url = source_url if source_url and source_url.startswith("http") else None diff --git a/cockpit/static/js/agent-avatars.js b/cockpit/static/js/agent-avatars.js index 7430891..9d959d4 100644 --- a/cockpit/static/js/agent-avatars.js +++ b/cockpit/static/js/agent-avatars.js @@ -12,7 +12,7 @@ window.AgentAvatars = (function () { knowledge: { hoodie: '#312e81', hair: '#374151', skin: '#e8b896', style: 'glasses', accent: '#6366f1' }, retail: { hoodie: '#365314', hair: '#2d1810', skin: '#ddb896', style: 'short', accent: '#b8ff3c' }, browser: { hoodie: '#0c4a6e', hair: '#1f2937', skin: '#c9a07a', style: 'short', accent: '#38bdf8' }, - hermes: { hoodie: '#1e40af', hair: '#3d2314', skin: '#e8b896', style: 'short', accent: '#2aabee' }, + hr: { hoodie: '#6b21a8', hair: '#2d1810', skin: '#ddb896', style: 'bob', accent: '#e879f9' }, email: { hoodie: '#334155', hair: '#4a3728', skin: '#ddb896', style: 'short', accent: '#94a3b8' }, research: { hoodie: '#115e59', hair: '#1a1a1a', skin: '#f5c9a8', style: 'glasses', accent: '#14b8a6' }, sysops: { hoodie: '#1e3a5f', hair: '#4a3728', skin: '#e8b896', style: 'short', accent: '#38bdf8', hat: 'cap' }, diff --git a/cockpit/templates/agents.html b/cockpit/templates/agents.html index 2d1d4d1..d552a9f 100644 --- a/cockpit/templates/agents.html +++ b/cockpit/templates/agents.html @@ -60,7 +60,7 @@

-

+

diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 52a810b..e8e41e5 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -4,16 +4,32 @@ Herman fungeert als **Co-CEO** in het centrum van het netwerk. Agents communiceren via events (`agent_events`) en worden gevisualiseerd op `/agents?tab=mesh`. -## Nieuwe agents (migratie 016) +## Agent overzicht -| Key | Naam | Rol | -|-----|------|-----| -| `sysops` | SysOps | Proxmox, Docker, VM monitoring | +| Key | Naam | Functie | +|-----|------|---------| +| `herman` | Herman | AI Co-CEO — briefing, orchestratie, delegatie | +| `marketing` | Marketing | Social, campagnes, RSS trends, brand | +| `bizdev` | BizDev | Retail partnerships, deals, listings | +| `finance` | Finance | Marges, pricing, pipeline-waardering | +| `sourcing` | Sourcing | Leveranciers, inkoop, halal ingredients | +| `product` | Product | SKU-ontwikkeling, launch, shelf readiness | +| `halal` | Halal | Certificering, compliance, gap-analyse | +| `design` | Design | ComfyUI, visuals, studio assets | +| `knowledge` | Knowledge | NAS, RAG, document analytics | +| `retail` | Retail Intel | Supermarkten 360, CBS, kansen | +| `browser` | Browser | Web research, concurrentie-monitoring | +| `hr` | HR | Personeelszaken, recruiting, onboarding | +| `email` | Email | IMAP/SMTP, inbox, verzenden | +| `research` | Research | Marktonderzoek, trends, data feeds | +| `sysops` | SysOps | IT infra, Docker, Gitea backup | | `packaging` | Packaging | SVG/PDF verpakkingsontwerp | +> **Let op:** `/hermes` is het Telegram Command Center (aparte module), geen agent in de soul registry. + ## Souls -Elke agent heeft een `soul_md` in PostgreSQL (`agent_souls`). Herman leest souls voor briefing en delegatie. +Elke agent heeft `role_title`, `responsibilities` en `soul_md` in PostgreSQL (`agent_souls`). De HR-soul is een placeholder en wordt later uitgewerkt. ## Permissions diff --git a/docs/PLATFORM-AZ.md b/docs/PLATFORM-AZ.md index 241bafe..c378144 100644 --- a/docs/PLATFORM-AZ.md +++ b/docs/PLATFORM-AZ.md @@ -87,7 +87,7 @@ Migraties in `migrations/`: | retail | Supermarkten 360 | | research | Marktonderzoek | | design | ComfyUI | -| … | bizdev, finance, sourcing, product, halal, knowledge, browser, hermes, email | +| … | bizdev, finance, sourcing, product, halal, knowledge, browser, hr, email | **Events:** `agent_events` — zichtbaar op `/agents`, klikbaar per agent. diff --git a/migrations/025_hr_agent_roles.sql b/migrations/025_hr_agent_roles.sql new file mode 100644 index 0000000..1846114 --- /dev/null +++ b/migrations/025_hr_agent_roles.sql @@ -0,0 +1,127 @@ +-- Vervang Hermes agent door HR + duidelijke functieomschrijvingen voor alle agents + +DELETE FROM agent_souls WHERE agent_key = 'hermes'; + +INSERT INTO agent_souls (agent_key, display_name, role_title, soul_md, responsibilities, avatar_emoji, avatar_color, avatar_mood, is_active) VALUES +('hr', 'HR', 'HR & People Operations', +'# HR — Soul + +> Soul wordt later uitgewerkt — dit is een voorlopige placeholder. + +Je bent de HR-agent van Foodlinkk (halal kant-en-klaar food business). + +## Functie +- Personeelszaken en team operations +- Recruiting, vacatures en kandidaat-screening +- Onboarding nieuwe medewerkers (incl. IT-toegang via SysOps) +- Verlof, contracten en arbeidsvoorwaarden bijhouden +- Team welzijn en interne communicatie + +## Samenwerking +- **Herman:** people-updates in CEO briefing +- **Finance:** salaris- en kostencontext (toekomst) +- **Knowledge:** HR-beleid en handboeken op NAS +- **SysOps:** accounts en toegang bij onboarding/offboarding', +'Personeelszaken · recruiting · onboarding · verlof & contracten · team welzijn', +'👥', '#e879f9', 'calm', true) +ON CONFLICT (agent_key) DO UPDATE SET + display_name = EXCLUDED.display_name, + role_title = EXCLUDED.role_title, + soul_md = EXCLUDED.soul_md, + responsibilities = EXCLUDED.responsibilities, + avatar_emoji = EXCLUDED.avatar_emoji, + avatar_color = EXCLUDED.avatar_color, + avatar_mood = EXCLUDED.avatar_mood, + is_active = EXCLUDED.is_active, + updated_at = NOW(); + +-- Duidelijke functieomschrijvingen (role_title + responsibilities) +UPDATE agent_souls SET + role_title = 'AI Co-CEO & Orchestrator', + responsibilities = 'Dagelijkse CEO-briefing · agent-orchestratie · taakdelegatie · goedkeuringsqueue · pipeline-overzicht', + updated_at = NOW() +WHERE agent_key = 'herman'; + +UPDATE agent_souls SET + role_title = 'Marketing & Communicatie', + responsibilities = 'Social media monitoring · content & campagnes · RSS/food trends · brand voice Foodlinkk · reclamefolders', + updated_at = NOW() +WHERE agent_key = 'marketing'; + +UPDATE agent_souls SET + role_title = 'Business Development', + responsibilities = 'Retail partnerships (Jumbo/AH/Plus) · deal pipeline · proposals · supermarkt-listing trajecten · CRM-koppelingen', + updated_at = NOW() +WHERE agent_key = 'bizdev'; + +UPDATE agent_souls SET + role_title = 'Finance & Pricing', + responsibilities = 'Pipeline-waardering · marges per SKU · prijsstelling retail · cashflow-inzicht · kostenanalyse', + updated_at = NOW() +WHERE agent_key = 'finance'; + +UPDATE agent_souls SET + role_title = 'Inkoop & Leveranciers', + responsibilities = 'Leveranciersdatabase · MOQ & lead times · halal ingredient sourcing · inkoopvoorwaarden · supplier vetting', + updated_at = NOW() +WHERE agent_key = 'sourcing'; + +UPDATE agent_souls SET + role_title = 'Productontwikkeling', + responsibilities = 'SKU-catalogus · shelf readiness · launch planning · retail listing-eisen · productlifecycle', + updated_at = NOW() +WHERE agent_key = 'product'; + +UPDATE agent_souls SET + role_title = 'Halal Compliance', + responsibilities = 'Halal-certificering · ingredient vetting · compliance registry · gap-analyse supermarkten · audit-voorbereiding', + updated_at = NOW() +WHERE agent_key = 'halal'; + +UPDATE agent_souls SET + role_title = 'Design & Visuals', + responsibilities = 'ComfyUI productfoto''s · visuele identiteit · studio assets · packaging visuals · retail presentatie', + updated_at = NOW() +WHERE agent_key = 'design'; + +UPDATE agent_souls SET + role_title = 'Kennisbank & Documenten', + responsibilities = 'NAS corpus · document analytics · sentiment & top-woorden · RAG-antwoorden · intern beleid doorzoeken', + updated_at = NOW() +WHERE agent_key = 'knowledge'; + +UPDATE agent_souls SET + role_title = 'Retail Intelligence', + responsibilities = '3.000+ supermarkten DB · CBS-demografie · halal opportunity scores · groothandels · sales milestones', + updated_at = NOW() +WHERE agent_key = 'retail'; + +UPDATE agent_souls SET + role_title = 'Web Research', + responsibilities = 'Autonome browser-sessies · concurrentie-monitoring · pagina-scraping · marktintel via web', + updated_at = NOW() +WHERE agent_key = 'browser'; + +UPDATE agent_souls SET + role_title = 'Email & Mailbox', + responsibilities = 'IMAP/SMTP sync · inbox beheer · concept-emails · verzenden namens Foodlinkk · klantcorrespondentie', + updated_at = NOW() +WHERE agent_key = 'email'; + +UPDATE agent_souls SET + role_title = 'Marktonderzoek', + responsibilities = 'Externe data feeds · markttrends · weather data · research briefs · data provider sync', + updated_at = NOW() +WHERE agent_key = 'research'; + +UPDATE agent_souls SET + role_title = 'IT Operations & Infra', + responsibilities = 'Proxmox & VM monitoring · Docker health · Gitea backup · maintenance scans · infra-topologie · SysOps-verslag', + updated_at = NOW() +WHERE agent_key = 'sysops'; + +UPDATE agent_souls SET + role_title = 'Verpakkingsontwerp', + responsibilities = 'SVG/PDF/PNG packaging studio · stanstekeningen · drukwerk-ready exports · NAS per project · Herman-commando''s', + updated_at = NOW() +WHERE agent_key = 'packaging';