managarten/packages/shared-ai/src/agents/templates/calmness.ts
Till JS a08e45ca16 feat(templates): generalise to WorkbenchTemplate + ship Calmness pilot (T1)
First pass of the workbench-templates plan (docs/plans/workbench-
templates.md) — templates are no longer agent-centric but a general
"starter kit" bundle: optional agent + optional scene + optional
missions + optional per-module seeds. Pilot non-AI template "Calmness"
ships alongside.

Shape generalisation (packages/shared-ai/src/agents/templates/types.ts):
- AgentTemplate renamed to WorkbenchTemplate; all fields now optional
  (agent, scene, missions, seeds). Back-compat AgentTemplate alias
  kept so research/context/today keep compiling.
- Added `category: 'ai'|'wellness'|'work'|'lifeEvent'|'delight'` +
  `icon` (for non-agent templates that have no avatar) + `version`
  field (for future update-detection).
- New WorkbenchTemplateSeedItem shape: `{stableId?, data: unknown}`.
  Module-specific seed payloads are typed at the handler side.
- Existing three AI templates nachgezogen: category='ai' (or
  'delight' for today-agent), icon, version='1'.

Seed infrastructure:
- apps/mana/apps/web/src/lib/data/ai/agents/seed-registry.ts — in-
  memory handler map keyed by module name; module-local seed.ts files
  register themselves at import time.
- apps/mana/apps/web/src/lib/modules/meditate/seed.ts — first handler:
  createPreset-based, idempotent via stableId embedded as HTML
  comment in the preset description (T1 pragmatism; T2 adds a proper
  column on the preset schema).
- data/ai/missions/setup.ts pulls `import '$lib/modules/meditate/seed'`
  so the handler is registered before any template is applied.

Applicator upgrades (data/ai/agents/apply-template.ts):
- Agent step now optional — skipped cleanly when template has no
  agent part.
- New step 4: seeds. Walks template.seeds, looks up the handler for
  each module, aggregates per-item outcomes (created/skipped-exists/
  failed) into result.seedOutcomes. Missing handler = warning, not
  fatal. Crypto/encryption unchanged — seeds go through the same
  module stores that module code already uses.
- Result shape gains `seedOutcomes: Record<string, SeedOutcome[]>`
  so the gallery can show "3 new, 1 already there".

Calmness pilot (packages/shared-ai/src/agents/templates/calmness.ts):
- category='wellness', NO agent, scene with meditate/mood/journal/
  sleep apps, two meditate preset seeds:
  * 4-7-8 Atmung (breathing preset)
  * Body-Scan 10min (bodyscan preset with 9 scan steps)
- Each seed has a stableId so re-apply is idempotent.

Gallery updates (routes/(app)/agents/templates/+page.svelte):
- Card avatar falls back to t.icon when no agent. "Agent" chip shows
  only for agent-templates; "N Seeds" chip shows for templates with
  seeds.
- Detail header shows "Workbench-Setup ohne AI-Agent" when no agent.
- New "Seeds" preview section: lists per-module counts + item names.
- Options section gains a "Seed-Daten in Module einpflegen" checkbox.
- Success panel shows seed summary: "3 Seeds neu, 1 bereits
  vorhanden".

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

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

72 lines
2.2 KiB
TypeScript

import type { WorkbenchTemplate } from './types';
/**
* Calmness — first non-AI workbench template.
*
* Legt eine Scene fürs Runterkommen an und seed-ed zwei Einstiegs-
* Meditationen ins Meditate-Modul. Kein Agent, keine Mission — dieses
* Template ist "Infrastruktur für Ruhe", keine Automation.
*
* Dient in Phase T1 des Workbench-Templates-Plans auch als Pilot-
* Template dafür wie nicht-AI-Templates aussehen. Folgende Templates
* (Fitness, Deep Work, …) nutzen denselben Shape.
*/
export const calmnessTemplate: WorkbenchTemplate = {
id: 'calmness',
version: '1',
label: 'Calmness',
icon: '🧘',
tagline: 'Atem, Stille, ruhige Momente',
description: `Ein Workbench-Setup für Stille-Momente. Legt dir eine Scene mit den Modulen Meditate, Mood, Journal und Sleep an und seed-et zwei Einstiegs-Meditationen — mehr brauchst du nicht um anzufangen.
Kein AI-Agent. Du meditierst, nicht dein Computer.`,
category: 'wellness',
color: '#8B5CF6',
scene: {
name: 'Calmness',
description: 'Ruhe, Atem, Stille',
openApps: [
{ appId: 'meditate', widthPx: 540 },
{ appId: 'mood', widthPx: 340 },
{ appId: 'journal', widthPx: 440 },
{ appId: 'sleep', widthPx: 340 },
],
},
seeds: {
meditate: [
{
stableId: 'template-calmness:preset:4-7-8',
data: {
name: '4-7-8 Atmung',
description:
'Beruhigende Atemtechnik. Einatmen 4 Sekunden, halten 7 Sekunden, ausatmen 8 Sekunden. Gut für abends oder bei Unruhe.',
category: 'breathing',
breathPattern: { inhale: 4, hold: 7, exhale: 8, rest: 0 },
defaultDurationSec: 300,
},
},
{
stableId: 'template-calmness:preset:bodyscan-10',
data: {
name: 'Body-Scan 10min',
description:
'Sanfte Aufmerksamkeits-Wanderung durch den Körper — von den Füßen bis zum Scheitel.',
category: 'bodyscan',
bodyScanSteps: [
'Spüre deine Füße',
'Spüre deine Beine',
'Spüre dein Becken',
'Spüre deinen Bauch',
'Spüre deine Brust',
'Spüre deine Arme',
'Spüre deinen Nacken',
'Spüre deinen Kopf',
'Spüre deinen ganzen Körper',
],
defaultDurationSec: 600,
},
},
],
},
};