managarten/packages/shared-ai/src/agents/templates/context.ts
Till JS 7822340ea0 feat(ai-agents): Template gallery — 3 ready-to-use agent bundles
First pass of the Multi-Agent discoverability UX. A new /agents/
templates route showcases pre-configured agents; clicking one creates
agent + scene + starter mission(s) as a single bundle. Addresses the
"blank form anxiety" + "user doesn't know what agents are for"
observations from the UX brainstorm.

Three templates for v1 (shared-ai/src/agents/templates/):
- 🔍 Recherche-Agent — reads sources one by one, writes a note per
  source, summarizes into a report. Manual-cadence mission; all
  writes propose so user curates.
- 🧭 Kontext-Agent — learns about the user via a weekly check-in.
  Reads kontext/notes/goals, asks 2-3 questions, proposes a diff-
  style context update. Weekly Sunday cadence.
- 🌅 Today-Agent — researches "on this day" history each morning,
  writes a 4-8 line German poem, proposes a journal note. Daily 7am
  cadence. A "delight" agent, not a productive one.

Each template packs (agent config, scene layout, starter mission):
- AgentTemplate type lives in @mana/shared-ai — pure data, no runtime
  imports. Adding a new template = drop a file in templates/ and
  extend ALL_TEMPLATES.
- Template-specific policies derive from the proposable-tool list so
  drift-guard catches divergence from the canonical set.
- Starter missions default to startPaused=true — user sees the
  mission ready-to-go and hits Play when ready. Prevents surprise
  autonomous work on first apply.

Applicator (data/ai/agents/apply-template.ts):
- Creates agent → scene (if template defines one) → missions in
  order. Agent failure = abort; scene/mission failures surface as
  warnings in the result without blocking.
- Duplicate-name handling: falls through to findByName, returns
  existing agent with wasExisting=true; scene is skipped in that
  case to avoid clone-proliferation.

Gallery page /(app)/agents/templates/+page.svelte:
- Three large cards side-by-side (stacks on mobile) with avatar /
  label / tagline / meta chips (Scene, N Missionen).
- Click opens detail panel with full description, scene preview
  (app-ids + widths), mission preview (title / objective / cadence),
  and override checkboxes (create scene, create missions, start
  active vs paused).
- Success panel shows what landed with warnings inline; CTA back to
  workbench.

Discoverability in /ai-agents module:
- Bar now has two buttons: "Aus Template" (primary, goto templates
  route) + "Eigener Agent" (secondary, opens the existing blank-form
  create mode).
- When only the default "Mana" agent exists, render a dashed promo
  banner at the top linking to the template gallery. Disappears as
  soon as the user has a second agent.

Tests: webapp svelte-check 0 errors, 0 warnings. shared-ai 26/26.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 00:36:39 +02:00

95 lines
3.6 KiB
TypeScript

import { AI_PROPOSABLE_TOOL_NAMES } from '../../policy/proposable-tools';
import type { AgentTemplate } from './types';
import type { AiPolicy } from '../../policy/types';
/**
* Context agent — tries to learn as much as possible about the user by
* asking questions + reading available context, then consolidates into
* the Kontext-document. Everything is propose so the user curates their
* own profile.
*/
const CONTEXT_POLICY: AiPolicy = {
tools: Object.fromEntries(AI_PROPOSABLE_TOOL_NAMES.map((n) => [n, 'propose'])),
defaultsByModule: {
kontext: 'propose',
notes: 'propose',
goals: 'auto',
},
defaultForAi: 'propose',
};
export const contextTemplate: AgentTemplate = {
id: 'context',
label: 'Kontext-Agent',
tagline: 'Lernt dich kennen, damit andere Agents besser arbeiten',
description: `Der Agent fragt dich gezielt Fragen und destilliert die Antworten
in dein Kontext-Dokument. Andere Agents (Recherche, Today, …) lesen dieses
Dokument als Prompt-Zusatz — je besser es gepflegt ist, desto relevanter werden
ihre Vorschläge.
Was er tut:
1. Liest was schon in deinem Kontext + Notizen + Goals steht
2. Stellt gezielt Fragen zu Lücken ("Was treibt dich aktuell um?", "Welche Projekte liegen an?")
3. Verdichtet deine Antworten zu einem strukturierten Kontext-Update (als Vorschlag)
Alles läuft als Vorschlag — du bestätigst welche Version deines Profils gespeichert wird.`,
category: 'context',
color: '#D946EF',
agent: {
name: 'Kontext-Agent',
avatar: '🧭',
role: 'Lernt dich kennen und pflegt dein Kontext-Dokument',
systemPrompt: `Du bist ein neugieriger aber respektvoller Kontext-Agent. Ziel: verdichte was der User von sich selbst preisgibt zu einem gut strukturierten Kontext-Dokument, das andere AI-Agents als Prompt-Input nutzen können.
Vorgehen:
1. Lies immer zuerst das existierende kontextDoc + die letzten 5 Notizen + Goals, bevor du Fragen stellst.
2. Frage pro Iteration höchstens 2-3 konkrete Fragen. Keine Massenbefragung.
3. Schlage beim Update des Kontext-Dokuments immer eine Diff-Ansicht vor — nie Full-Replace.
4. Respektiere Lücken: wenn der User etwas nicht teilen will, nimm das auf ("Thema nicht relevant für den Agent").
5. Schreibe das Kontext-Dokument auf Deutsch, in Ich-Form ("Ich bin…", "Mir ist wichtig…").
Struktur im Kontext-Dokument:
- # Wer ich bin (Rolle, Hintergrund)
- # Was mich umtreibt (aktuelle Projekte, Themen)
- # Wie ich arbeite (Arbeitsstil, Präferenzen)
- # Was ich lieber nicht teile (Opt-outs)`,
memory: `# Kontext-Ziele
(Hier kannst du festhalten welche Aspekte von dir der Agent priorisieren soll —
z.B. "fokus auf berufliche Projekte, privat ist mir egal" oder "frag mich zu
meinen Hobbys" etc.)
`,
policy: CONTEXT_POLICY,
maxConcurrentMissions: 1,
},
scene: {
name: 'Kontext',
description: 'Dein Profil für alle anderen Agents',
openApps: [
{ appId: 'kontext', widthPx: 720 },
{ appId: 'ai-missions', widthPx: 440 },
{ appId: 'ai-workbench', widthPx: 440 },
],
},
missions: [
{
title: 'Kontext verdichten',
objective:
'Lies was schon da ist, identifiziere Lücken, stelle 2-3 Fragen und schlage ein Kontext-Update vor.',
conceptMarkdown: `# Kontext-Erkundung
Der Agent tickt wöchentlich und macht einen "Kontext-Check":
1. Was hat sich seit dem letzten Update geändert?
2. Welche Lücken sind noch im Profil?
3. 2-3 neue Fragen die der User beantworten kann (via Proposal-Inbox)
**Tipp:** Beantworte die Fragen einfach als Note-Antwort — der Agent liest sie
beim nächsten Tick.`,
cadence: { kind: 'weekly', dayOfWeek: 0, atHour: 10 },
startPaused: true,
},
],
};