From 9d6a5a53a8a2ff2716bd95d51399f5bf5f0e156e Mon Sep 17 00:00:00 2001 From: Till JS Date: Tue, 21 Apr 2026 16:32:41 +0200 Subject: [PATCH] feat(apps): register agents + timeline as MANA_APPS + broadcast URL fix + members page chrome MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three modules move from "dedicated route only" to "first-class apps in the launcher". After this they show up in the AppDrawer pill, can be pinned to workbench scenes, and get a direct URL from the app switcher. MANA_APPS entries added: - agents (/agents) — AI agent management. Icon: smiling robot head with antenna dot. violet→fuchsia gradient, status beta, requiredTier beta. - timeline (/timeline) — Chronological view across modules. Icon: vertical event dots with connecting axis. amber→orange, status beta, requiredTier beta. Plus: broadcast's MANA_APPS entry already existed but had no URL override, so the auto-derived /broadcast didn't match the real route at /broadcasts. Added an APP_URL_OVERRIDES entry mapping id='broadcast' → '/broadcasts' so the app switcher lands the user on the right page. Icon + module.config stay singular. Route wiring: - /agents previously only had /agents/templates/ as a subroute. Added /agents/+page.svelte that renders the existing ai-agents ListView (at $lib/modules/ai-agents/), so the top-level URL works from the AppDrawer. - /timeline already had a root +page.svelte — no work there. - /broadcasts already had a root +page.svelte — no work there. /spaces/members page chrome: - Swapped the hand-rolled header for @mana/shared-ui PageHeader with backHref="/", breadcrumb "Workbench › Mitglieder verwalten", and the space name + type as the description. Feels like a native Mana page now instead of an orphaned admin route. - Dropped the ~60 lines of unused .type-chip CSS (moved the chip info into the PageHeader description string). - Container bumped to 720px max-width to match other admin pages. 0 errors across 7236 files. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../web/src/routes/(app)/agents/+page.svelte | 14 +++ .../routes/(app)/spaces/members/+page.svelte | 106 +++--------------- packages/shared-branding/src/app-icons.ts | 12 ++ packages/shared-branding/src/mana-apps.ts | 37 ++++++ 4 files changed, 81 insertions(+), 88 deletions(-) create mode 100644 apps/mana/apps/web/src/routes/(app)/agents/+page.svelte diff --git a/apps/mana/apps/web/src/routes/(app)/agents/+page.svelte b/apps/mana/apps/web/src/routes/(app)/agents/+page.svelte new file mode 100644 index 000000000..b781c4bd4 --- /dev/null +++ b/apps/mana/apps/web/src/routes/(app)/agents/+page.svelte @@ -0,0 +1,14 @@ + + + diff --git a/apps/mana/apps/web/src/routes/(app)/spaces/members/+page.svelte b/apps/mana/apps/web/src/routes/(app)/spaces/members/+page.svelte index 6a9e7913e..06fa9228f 100644 --- a/apps/mana/apps/web/src/routes/(app)/spaces/members/+page.svelte +++ b/apps/mana/apps/web/src/routes/(app)/spaces/members/+page.svelte @@ -12,6 +12,7 @@ */ import { onMount } from 'svelte'; + import { PageHeader } from '@mana/shared-ui'; import { getActiveSpace, authFetch } from '$lib/data/scope'; import { SPACE_TYPE_LABELS } from '@mana/shared-branding'; @@ -143,17 +144,18 @@
-
-

Mitglieder

- {#if activeSpace} -

- {activeSpace.name} - {SPACE_TYPE_LABELS.de[activeSpace.type]} -

- {/if} -
+ + {#snippet breadcrumb()} + Workbench Mitglieder verwalten + {/snippet} + {#if !activeSpace}

Lade aktiven Space …

@@ -263,87 +265,15 @@ instead of falling back to hardcoded white. */ .container { - max-width: 640px; + max-width: 720px; margin: 0 auto; - padding: 1.5rem 1rem 4rem; + padding: 0 1rem 4rem; color: hsl(var(--color-foreground)); } - .page-head { - margin-bottom: 1.5rem; - } - - .page-head h1 { - font-size: 1.5rem; - font-weight: 600; - margin: 0 0 0.25rem; - color: hsl(var(--color-foreground)); - } - - .subtitle { - display: flex; - align-items: center; - gap: 0.5rem; - margin: 0; - color: hsl(var(--color-muted-foreground, 0 0% 55%)); - font-size: 0.875rem; - } - - .type-chip { - font-size: 0.6875rem; - padding: 0.125rem 0.5rem; - border-radius: 9999px; - background: hsl(var(--color-muted, 0 0% 94%)); - color: hsl(var(--color-muted-foreground, 0 0% 45%)); - text-transform: uppercase; - letter-spacing: 0.02em; - font-weight: 500; - } - - .type-chip[data-type='brand'] { - background: hsl(260 60% 95%); - color: hsl(260 55% 35%); - } - .type-chip[data-type='club'] { - background: hsl(160 45% 93%); - color: hsl(160 55% 28%); - } - .type-chip[data-type='family'] { - background: hsl(30 70% 93%); - color: hsl(30 55% 35%); - } - .type-chip[data-type='team'] { - background: hsl(210 55% 93%); - color: hsl(210 55% 32%); - } - .type-chip[data-type='practice'] { - background: hsl(340 50% 94%); - color: hsl(340 50% 38%); - } - - :global(.dark) .type-chip { - background: hsl(var(--color-muted, 0 0% 20%)); - color: hsl(var(--color-muted-foreground, 0 0% 75%)); - } - :global(.dark) .type-chip[data-type='brand'] { - background: hsl(260 40% 25%); - color: hsl(260 80% 85%); - } - :global(.dark) .type-chip[data-type='club'] { - background: hsl(160 35% 20%); - color: hsl(160 70% 80%); - } - :global(.dark) .type-chip[data-type='family'] { - background: hsl(30 40% 22%); - color: hsl(30 80% 82%); - } - :global(.dark) .type-chip[data-type='team'] { - background: hsl(210 40% 22%); - color: hsl(210 70% 82%); - } - :global(.dark) .type-chip[data-type='practice'] { - background: hsl(340 35% 23%); - color: hsl(340 65% 82%); + .crumb-sep { + margin: 0 0.25rem; + opacity: 0.5; } .hint-card { diff --git a/packages/shared-branding/src/app-icons.ts b/packages/shared-branding/src/app-icons.ts index c97cf218b..f029e3c4c 100644 --- a/packages/shared-branding/src/app-icons.ts +++ b/packages/shared-branding/src/app-icons.ts @@ -248,6 +248,18 @@ export const APP_ICONS = { // (emerald) while staying in the "communication" colour family. `` ), + agents: svgToDataUrl( + // Smiling robot head with antenna dot — represents the AI agents that + // carry out autonomous missions. Violet→fuchsia gradient sits next to + // companion in the AI Workbench family. + `` + ), + timeline: svgToDataUrl( + // Vertical event-dots with connecting line — timeline/history axis. + // Amber→orange gradient so it stands apart from the blue Activity icon + // while still reading as "chronological" in the AI Workbench family. + `` + ), } as const; export type AppIconId = keyof typeof APP_ICONS; diff --git a/packages/shared-branding/src/mana-apps.ts b/packages/shared-branding/src/mana-apps.ts index c38c662fe..be48c8de6 100644 --- a/packages/shared-branding/src/mana-apps.ts +++ b/packages/shared-branding/src/mana-apps.ts @@ -1071,6 +1071,40 @@ export const MANA_APPS: ManaApp[] = [ status: 'development', requiredTier: 'alpha', }, + { + id: 'agents', + name: 'Agents', + description: { + de: 'KI-Agenten verwalten', + en: 'Manage AI agents', + }, + longDescription: { + de: 'Lege mehrere KI-Agenten an — jeder mit eigenem Namen, Avatar, System-Prompt, Memory und Tool-Policy. Agents führen autonome Missions aus und schreiben unter ihrer eigenen Identität.', + en: 'Create multiple AI agents — each with its own name, avatar, system prompt, memory and tool policy. Agents run autonomous missions and write under their own identity.', + }, + icon: APP_ICONS.agents, + color: '#8b5cf6', + comingSoon: false, + status: 'beta', + requiredTier: 'beta', + }, + { + id: 'timeline', + name: 'Timeline', + description: { + de: 'Was wurde wann getan', + en: 'What happened when', + }, + longDescription: { + de: 'Chronologische Übersicht aller Einträge über alle Module — Tasks, Events, Kalender, KI-Missionen. Mit Akteur-Filter (User vs. KI vs. System) und Analytics-Ansicht.', + en: 'A chronological view of every record across every module — tasks, events, calendar, AI missions. With actor filter (user / AI / system) and analytics drill-down.', + }, + icon: APP_ICONS.timeline, + color: '#f59e0b', + comingSoon: false, + status: 'beta', + requiredTier: 'beta', + }, ]; /** @@ -1162,6 +1196,9 @@ const APP_URL_OVERRIDES: Partial = Object.fromEntries(