mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 03:41:10 +02:00
docs(landing): devlog entries Apr 9–15
Seven devlog posts covering the daily development sprint: - Apr 9: News module, Body tracker, Nutriphi AI photo, infra marathon - Apr 10: Journal sync, credits/billing, geocoding, a11y - Apr 11: Settings redesign, geocoding, deployment, monitoring - Apr 12: UI redesign, wallpaper generator, floating input, drink module - Apr 13: Companion brain, sleep/stretch/recipes/mail modules - Apr 14: AI Workbench, actor attribution, missions, key-grants - Apr 15: Multi-agent workbench, news-research, settings, theme migration Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
efc7641a60
commit
35ffa8a079
9 changed files with 2358 additions and 0 deletions
|
|
@ -0,0 +1,245 @@
|
|||
---
|
||||
title: 'News-Modul, Body-Tracker, Nutriphi AI-Foto, Workbench-Polish + Infra-Marathon'
|
||||
description: 'Größter Commit-Tag seit Launch: 143 Commits. News-Modul mit Backend-Ingester und Workbench-ListView live. Body-Modul (Fitness + Körperkomposition) mit Routinen und Correlation-Chart. Nutriphi bekommt AI-Foto-Erkennung und Meal-Details. Cloudflare-Tunnel-Rebuild, Sync-Debug-Runbook, Wire-Format-Versioning, mana-api Deployment-Fix, 270 Svelte-Warnings auf Null.'
|
||||
date: 2026-04-09
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'news',
|
||||
'body',
|
||||
'nutriphi',
|
||||
'workbench',
|
||||
'cloudflare',
|
||||
'mana-api',
|
||||
'sync',
|
||||
'ai',
|
||||
'vercel-ai-sdk',
|
||||
'gemma4',
|
||||
'infrastructure',
|
||||
]
|
||||
featured: true
|
||||
commits: 143
|
||||
readTime: 18
|
||||
stats:
|
||||
filesChanged: 833
|
||||
linesAdded: 40847
|
||||
linesRemoved: 22379
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 143
|
||||
workingHours:
|
||||
start: '2026-04-09T09:00'
|
||||
end: '2026-04-09T23:30'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **News-Modul komplett**: Backend-Ingester (`news-ingester` Service), Client-Data-Layer, Web-Routes, i18n, Workbench-ListView mit Dashboard-Widget — alles in einem Tag
|
||||
- **Body-Modul** (Fitness + Body-Composition): Exercise-Picker, Routinen, Phasen, Progression-Chart, Calorie×Weight-Correlation, i18n, Integration-Tests
|
||||
- **Nutriphi AI-Foto**: Photo-Capture + AI-Meal-Recognition-Flow, Meal-Detail-Page mit Foods-Breakdown, Quick-Add in Workbench, Context-Menu-Quickaction
|
||||
- **Workbench-Inline-Actions** für 7 Module: Inventory, Picture, Moodlit, Events, Context, Who — jeweils eigene Quick-Create-UIs im ListView
|
||||
- **Cloudflare-Tunnel-Rebuild**: `cloudflared-config.yml` als Single Source of Truth, Pre-Commit-Validator, Apex-Domain via API
|
||||
- **Wire-Format Envelope Versioning** + Anthropic Prompt-Cache-Hints für mana-api
|
||||
- **270 Svelte-Warnings auf Null** in einem Sweep
|
||||
- **mana-api Deployment-Fix**: `mana-api.mana.how` statt `api.mana.how` wegen Conflict mit dem bestehenden Gateway
|
||||
|
||||
---
|
||||
|
||||
## News-Modul — von Null auf Workbench in einem Tag
|
||||
|
||||
Das News-Modul war bis heute nur eine Idee. Jetzt steht die komplette Pipeline:
|
||||
|
||||
### Backend: news-ingester Service
|
||||
|
||||
Neuer eigenständiger Service `news-ingester` — ein Hono/Bun-Server der RSS-Feeds pollt, Artikel parsed (Readability-Fallback für Volltext), und über eine curated Feed-API bereitstellt. Drei Bugs gleich am ersten Tag gefunden und gefixt:
|
||||
|
||||
- **Readability-Fallback crashte den Service** in einer Endlosschleife — disabled als Quick-Fix, JSDOM-CSS-Errors vorher schon gesilenced
|
||||
- **Unused `@mana/shared-hono` Workspace-Dep** machte den Docker-Build unnötig komplex — gedroppt
|
||||
- **JSDOM process-level Safety-Net** hinzugefügt damit ein einzelner Parse-Fehler nicht den ganzen Ingester killt
|
||||
|
||||
### Client: Data-Layer + Module-Library
|
||||
|
||||
Standard-Muster: `collections.ts` + `queries.ts` + `stores/` + `module.config.ts`. Dexie-Tabellen für Articles und User-Preferences (Feed-Selection, Read-Status, Bookmarks).
|
||||
|
||||
### Web-Routes + i18n
|
||||
|
||||
`/news` mit Feed-Tabs, Artikel-Cards, Onboarding-Flow. i18n für de/en/fr/es/it. Die Onboarding-Handoff zum Feed-Branch war ein subtiler Bug — User der Preferences speichert bevor er Feeds gewählt hat, landete auf einer leeren Seite statt im Onboarding.
|
||||
|
||||
### Workbench-Integration
|
||||
|
||||
ListView + Dashboard-Widget. "Interested" markiert Artikel als gespeichert und hält sie sichtbar auch wenn der Feed weiterscrollt.
|
||||
|
||||
### Auth-Fixes
|
||||
|
||||
- Bearer-Token fehlte in API-Calls → 401
|
||||
- Dexie v4 Schema-Upgrade nötig wegen neuer Tabellen
|
||||
- `getValidToken()` statt `getAccessToken()` — letzteres gibt abgelaufene Tokens zurück
|
||||
- Vault-Lock-Guard auf Preferences damit verschlüsselte Reads nicht crashen
|
||||
|
||||
---
|
||||
|
||||
## Body-Modul — Fitness + Körperkomposition
|
||||
|
||||
Komplett neues Modul in `modules/body/`:
|
||||
|
||||
### Phase 1: Foundation
|
||||
|
||||
- Dexie-Tabellen: `bodyMeasurements`, `bodyExercises`, `bodyRoutines`, `bodyWorkouts`
|
||||
- UI-Komponenten: Route, Dashboard-Widget, i18n (de/en)
|
||||
- Encryption für alle User-Typed-Fields
|
||||
|
||||
### Phase 2: Exercise + Routinen
|
||||
|
||||
- **Exercise-Picker** mit Kategorien (Kraft, Cardio, Flexibilität, …)
|
||||
- **Routinen-System**: vordefinierte + Custom-Routinen, Phasen-basierte Progression
|
||||
- **Progression-Chart** mit d3-basierter Visualisierung
|
||||
|
||||
### Phase 3: Correlation
|
||||
|
||||
- **Calorie × Weight Correlation-Chart** — verknüpft Body-Measurements mit Nutriphi-Daten
|
||||
- Full i18n für alle neuen UI-Strings
|
||||
|
||||
### Integration-Tests
|
||||
|
||||
`bodyStore` Mutations (create, update, delete Measurements + Workouts) mit fake-indexeddb getestet.
|
||||
|
||||
**Fix am selben Tag**: Routine-Creation war geblocked wegen eines Duplicate-Headers — `<PageHeader>` war sowohl im Layout als auch in der Routine-Page.
|
||||
|
||||
---
|
||||
|
||||
## Nutriphi — AI-Foto-Erkennung + Meal-Details
|
||||
|
||||
### Photo-Capture + AI-Recognition
|
||||
|
||||
Neuer Flow: Foto aufnehmen → Upload an `/api/v1/nutriphi/photos/upload` → Analyse via `/api/v1/nutriphi/analysis/photo` → erkannte Lebensmittel werden als Foods in die Mahlzeit eingetragen.
|
||||
|
||||
**API-Refactor**: Der monolithische Photo-Endpoint wurde in zwei getrennt (Upload + Analysis), damit der Upload sofort ein Thumbnail liefert und die Analysis async laufen kann.
|
||||
|
||||
**Vision-Model-Fixes**:
|
||||
|
||||
- `supportsStructuredOutputs=true` auf dem mana-llm Provider gesetzt
|
||||
- Default Vision-Model auf `ollama/gemma3:4b` geändert
|
||||
- mana-llm Path-Prefix und Model-Name in Vision-Routes korrigiert
|
||||
- `response_format` zum Ollama-Adapter hinzugefügt + Markdown-Fences gestrippt
|
||||
|
||||
### Meal-Details + Quick-Add
|
||||
|
||||
- **Meal-Detail-Page** mit Foods-Breakdown und Thumbnail-aware Listen
|
||||
- **Inline Text + Photo Quick-Add** im Workbench-ListView
|
||||
- **Global Quick-Input Adapter** für die Search-Bar
|
||||
- **Context-Menu Quick-Action** "Neue Mahlzeit"
|
||||
- Integration-Tests für Meal-Mutations + Encryption
|
||||
|
||||
---
|
||||
|
||||
## Workbench-Inline-Actions — 7 Module an einem Tag
|
||||
|
||||
Sechs Module bekamen eigene Quick-Create-UIs direkt im Workbench-ListView:
|
||||
|
||||
| Modul | Inline-Action |
|
||||
| --------- | ------------------------------------ |
|
||||
| Inventory | Quick Item Creation |
|
||||
| Picture | Inline Upload |
|
||||
| Moodlit | Inline Mood Creation |
|
||||
| Events | Detail-Overlay via ViewProps |
|
||||
| Context | Inline Document Creation |
|
||||
| Who | Inline Game-Play + Character-Dossier |
|
||||
|
||||
Plus **shared Voice-Transcription-Helper** als wiederverwendbarer Baustein für Module die Voice-Input wollen.
|
||||
|
||||
**Who-Modul Extras**:
|
||||
|
||||
- Character-Dossier-System mit staged Fact-Disclosure
|
||||
- Chat-Bubble Tailwind-Classes von v3 → v4 migriert
|
||||
- `createdAt` + `gameId`-Index für Messages
|
||||
|
||||
---
|
||||
|
||||
## Cloudflare-Tunnel-Rebuild
|
||||
|
||||
Die Tunnel-Konfiguration war verstreut über Compose-Files, lokale Configs und die Cloudflare-API. Heute konsolidiert:
|
||||
|
||||
1. **`cloudflared-config.yml` als Single Source of Truth** — alle Ingress-Rules an einem Ort
|
||||
2. **Pre-Commit-Validator** — `chore(infra): pre-commit validator for cloudflared-config.yml` verhindert kaputte Configs
|
||||
3. **Apex-Domain via API** — smarter Tunnel-Rebuild der die Root-Domain per API statt per Dashboard konfiguriert
|
||||
4. **Sane Health-Probes** — keine false-positive Alerts mehr bei Container-Restarts
|
||||
|
||||
---
|
||||
|
||||
## Wire-Format Envelope Versioning
|
||||
|
||||
mana-api bekommt Envelope-Versioning für die Client-Server-Kommunikation. Jede Response enthält jetzt eine `v`-Property die dem Client sagt welches Format er erwarten kann. Dazu: **Anthropic Prompt-Cache-Hints** für AI-Calls — die System-Prompts werden als cacheable markiert damit wiederholte Calls günstiger werden.
|
||||
|
||||
---
|
||||
|
||||
## AI-Backend-Fixes
|
||||
|
||||
- **Vercel AI SDK + Zod** für Nutriphi/Planta Vision-Routes — strukturierte Outputs statt JSON-Parse
|
||||
- **Shared AI Zod-Schemas** in `@mana/shared-types` extrahiert, alle AI-Endpoints konsumieren via `z.infer`
|
||||
- **gemma4:e4b** als neues Default-Model auf dem mana-server
|
||||
- **`shared-llm`**: Fallback auf `message.reasoning` wenn `content` leer ist
|
||||
- **mana-server Tier-Topologie** in Code + CLAUDE.md korrigiert
|
||||
|
||||
---
|
||||
|
||||
## Sync-Debug + Infra
|
||||
|
||||
### Sync-Debug-Runbook
|
||||
|
||||
`SYNC_DEBUG.md` mit neuem Debug-API in Schritt C. Client-seitig: Debug-Info exposed, silent Push-Failures werden jetzt sichtbar als Toast.
|
||||
|
||||
### mana-api Deployment
|
||||
|
||||
`mana-api.mana.how` statt `api.mana.how` — der alte Hostname kollidierte mit dem API-Gateway. Dockerfile-Fix: `@mana/shared-types` muss explizit in den Build-Context kopiert werden.
|
||||
|
||||
### Who-Modul Server-Side
|
||||
|
||||
- Server-Side Validation von `[IDENTITY_REVEALED]` Sentinel
|
||||
- `/v1/chat/completions` Path für mana-llm korrigiert
|
||||
- Guest-Prompt auf JWT-Expiry surfaced
|
||||
|
||||
### Sonstige Fixes
|
||||
|
||||
| Fix | Detail |
|
||||
| ----------------------- | -------------------------------------------------------------- |
|
||||
| 270 Svelte-Warnings → 0 | `mana/web` + packages komplett bereinigt |
|
||||
| Vault-Unlock-Failures | Logging + Toast hinzugefügt |
|
||||
| shared-llm Privacy-Tier | Candidate-Tiers privacy-first sortiert (Browser vor Server) |
|
||||
| mana-media Migration | Initial Schema-Migration + Run on Startup |
|
||||
| Packages | Modal keydown-Handlers, `$derived.by` Usage, UserData-Fields |
|
||||
| Cross-Package Imports | Broken Imports + Missing Exports gefixt |
|
||||
| Mac Mini | Container-Conflicts in build-app.sh Restart-Cycle bereinigt |
|
||||
| shared-auth | Passkey/2FA/Session-Methods durch ManaAuthStore durchgeproxied |
|
||||
| Help-Modul | Broken Imports + SupportedLanguage-Typing gefixt |
|
||||
| liveQuery | Migration auf `useLiveQueryWithDefault` |
|
||||
| Rename | inventar → inventory across the codebase |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| ----------------------------------- | -------------- |
|
||||
| Commits | 143 |
|
||||
| Files changed | 833 |
|
||||
| LOC added | ~40.800 |
|
||||
| LOC removed | ~22.400 |
|
||||
| Net | +18.400 |
|
||||
| Neue Module | 2 (News, Body) |
|
||||
| Module mit Workbench-Inline-Actions | 7 |
|
||||
| API-Fixes | 8 |
|
||||
| Svelte-Warnings eliminiert | 270 |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Ein News-Backend ist mehr Arbeit als erwartet** — RSS-Parsing, Readability-Fallback, JSDOM-Crashes, Feed-Curation. Jedes einzelne ist trivial, zusammen sind's einen halben Tag.
|
||||
|
||||
2. **Vision-Model-Routing hat viele Moving Parts** — Provider-Config, Model-Name, Path-Prefix, Response-Format, Structured-Output-Flag. Fünf Stellen die alle stimmen müssen damit ein Bild erkannt wird.
|
||||
|
||||
3. **Cloudflare-Tunnel-Config als Code** spart langfristig Debugging-Zeit. Die Pre-Commit-Validation hat am selben Tag schon einen kaputten Ingress-Rule gefangen.
|
||||
|
||||
4. **270 Warnings sind nicht "noise"** — der Sweep fand drei echte Bugs (falsche `$derived.by`-Usage, fehlende `createdAt`-Stamps, broken cross-package Imports) die nur zufällig nicht im Prod-Build crashten.
|
||||
|
|
@ -0,0 +1,296 @@
|
|||
---
|
||||
title: 'Mega-Sprint: News-Modul, Body-Fitness, Nutriphi AI-Foto, Workbench Inline-Actions + 60 Bugfixes'
|
||||
description: 'Größter Tag seit dem Encryption-Rollout: News-Modul mit Backend-Ingester + RSS-Feeds, Body-Fitness-Modul mit Routinen + Progressions-Chart, Nutriphi AI-Foto-Erkennung, 8 Module mit Workbench-Inline-Actions, Who-Dossier-System, Sync-Debug-Runbook, Wire-Format-Versioning, Cloudflare-Tunnel-Rebuild, 270 Warnings auf null.'
|
||||
date: 2026-04-09
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'news',
|
||||
'body',
|
||||
'nutriphi',
|
||||
'workbench',
|
||||
'inline-actions',
|
||||
'who',
|
||||
'sync',
|
||||
'cloudflare',
|
||||
'ai',
|
||||
'zod',
|
||||
'vercel-ai-sdk',
|
||||
'bug-sweep',
|
||||
]
|
||||
featured: true
|
||||
commits: 143
|
||||
readTime: 22
|
||||
stats:
|
||||
filesChanged: 833
|
||||
linesAdded: 40847
|
||||
linesRemoved: 22379
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 143
|
||||
workingHours:
|
||||
start: '2026-04-09T08:00'
|
||||
end: '2026-04-09T23:59'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **News-Modul** — Backend-Ingester-Service, kuratierte RSS-Feeds, Client-Data-Layer, Workbench-ListView + Dashboard-Widget, "Interested"-Bookmark, Onboarding-Flow
|
||||
- **Body-Fitness-Modul** — neues Modul für kombiniertes Fitness-Training + Körperkomposition, Exercise-Picker, Routinen, Phasen, Progressions-Chart, Calorie×Weight-Korrelation, i18n, Integration-Tests
|
||||
- **Nutriphi AI-Foto-Erkennung** — Photo-Capture + AI-Meal-Recognition, Meal-Detail-Page mit Foods-Breakdown, Inline Quick-Add, globaler Quick-Input-Adapter
|
||||
- **Workbench Inline-Actions** für 8 Module — Inventory, Picture, Moodlit, Context, Events, Who, Body, Chat
|
||||
- **Who-Dossier-System** — Character-Dossier mit gestaffelter Fact-Disclosure, inline Who-Games im Workbench
|
||||
- **Wire-Format Envelope Versioning** + Anthropic Prompt-Cache Hints im API-Server
|
||||
- **270 Compiler-Warnings auf null** — großer Sweep über mana/web + alle Packages
|
||||
- **Cloudflare-Tunnel-Rebuild** — Tunnel als Single Source of Truth, Pre-Commit-Validator
|
||||
- **Sync-Debug-Runbook** mit neuem Debug-API
|
||||
|
||||
---
|
||||
|
||||
## News-Modul — von Null auf Dashboard-Widget
|
||||
|
||||
Das News-Modul wurde an einem Tag end-to-end aufgebaut, vom Backend-Ingester bis zum Workbench-Widget.
|
||||
|
||||
### Backend: news-ingester Service
|
||||
|
||||
Neuer Service `news-ingester` als Hono/Bun-App mit kuratierten RSS-Feed-Quellen. Der Ingester pollt Feeds per Cron, parsed Articles via JSDOM + Readability, speichert in PostgreSQL. Zwei Bugs im Ingester sofort gefixt:
|
||||
|
||||
- **JSDOM CSS-Errors**: Readability-Fallback crashte den Ingester in einer Loop. Fix: CSS-Error-Silence + Process-Level Safety-Net + Readability-Fallback komplett disabled
|
||||
- **Unused `@mana/shared-hono` dep**: entfernt, der Ingester braucht kein Auth-Middleware
|
||||
|
||||
### Frontend: Client-Data-Layer + UI
|
||||
|
||||
```
|
||||
news-ingester (Hono/Bun)
|
||||
↓ curated RSS feeds
|
||||
PostgreSQL
|
||||
↓ /api/v1/news/*
|
||||
mana-web
|
||||
↓ Dexie collections + liveQuery
|
||||
News workbench (ListView + detail)
|
||||
↓ dashboard widget
|
||||
Dashboard
|
||||
```
|
||||
|
||||
- `collections.ts` + `queries.ts` + Store mit Bookmark/Interest-Aktionen
|
||||
- i18n Locales für de/en
|
||||
- Workbench ListView mit Article-Cards
|
||||
- Dashboard-Widget mit den neuesten 5 Artikeln
|
||||
- **"Interested"-Feature**: Artikel als interessant markieren → bleibt sichtbar + bekommt ein Saved-Badge
|
||||
- **Onboarding**: Instant Handoff zum Feed-Branch nach der ersten Selektion
|
||||
|
||||
### Auth + Vault Guards
|
||||
|
||||
Drei Auth-Fixes für das News-Modul:
|
||||
|
||||
- Bearer Token korrekt im API-Client
|
||||
- `getValidToken()` statt raw `getAccessToken()`
|
||||
- Guard gegen Vault-Lock (Prefs nicht laden wenn Vault locked)
|
||||
- Client-side API URL statt Server-URL für SSR-Kompatibilität
|
||||
- Dexie v4 Schema-Upgrade für die neuen News-Tabellen
|
||||
|
||||
---
|
||||
|
||||
## Body-Fitness-Modul — kombiniertes Training + Körperkomposition
|
||||
|
||||
Komplett neues Modul `body` in `$lib/modules/body/`:
|
||||
|
||||
**Phase 1 — Foundation**:
|
||||
|
||||
- Dexie-Tabellen für Workouts, Exercises, Body-Measurements
|
||||
- UI-Komponenten, Route, i18n, Dashboard-Widget
|
||||
- Module in den Workbench-App-Registry eingetragen
|
||||
|
||||
**Phase 2 — Features**:
|
||||
|
||||
- Exercise-Picker mit Kategorien (Kraft, Cardio, Flexibility)
|
||||
- Routinen-System mit vordefinierten Trainingsabläufen
|
||||
- Phasen-Tracking (Aufwärmen, Training, Cool-Down)
|
||||
- Progressions-Chart (Gewicht × Wiederholungen über Zeit)
|
||||
- Calorie×Weight-Korrelation-Chart (volle i18n)
|
||||
|
||||
**Phase 3 — Quality**:
|
||||
|
||||
- Integration-Tests für `bodyStore` Mutations mit fake-indexeddb
|
||||
- Fix: Routine-Creation unblocked + Duplicate-Header entfernt
|
||||
|
||||
---
|
||||
|
||||
## Nutriphi: AI-Foto-Mahlzeit-Erkennung
|
||||
|
||||
Das Nutriphi-Modul (Ernährungstracking) bekommt eine AI-gestützte Foto-Erkennung:
|
||||
|
||||
### API-Refactor
|
||||
|
||||
`/api/v1/nutriphi/photo` aufgesplittet in zwei Endpoints:
|
||||
|
||||
- `POST /photos/upload` — Foto in MinIO ablegen, Thumbnail generieren
|
||||
- `POST /analysis/photo` — AI-Vision-Analyse über mana-llm (Vercel AI SDK + Zod für strukturierte Outputs)
|
||||
|
||||
Beide Endpoints nutzen jetzt den Vercel AI SDK mit `supportsStructuredOutputs: true` und Zod-Schemas für typsichere AI-Responses. Der Default-Vision-Model wurde auf `ollama/gemma3:4b` gesetzt.
|
||||
|
||||
### Frontend
|
||||
|
||||
- **Photo-Capture**: Kamera-Button in der Workbench-ListView, nimmt ein Foto auf → Upload → AI-Analyse → strukturierte Mahlzeit mit Lebensmitteln + Kalorien
|
||||
- **Meal-Detail-Page**: Foods-Breakdown mit Nährwerten pro Lebensmittel, Thumbnail-aware Listen
|
||||
- **Inline Quick-Add**: Text + Photo direkt in der ListView
|
||||
- **Global Quick-Input-Adapter**: Nutriphi ist über die globale Suchleiste erreichbar ("Neue Mahlzeit")
|
||||
- **Context-Menu Quick-Action**: Rechtsklick → "Neue Mahlzeit"
|
||||
|
||||
### Tests
|
||||
|
||||
- Integration-Tests für Meal-Mutations + Encryption
|
||||
- Consistency-Guard-Test: Workbench-Registry ↔ `MANA_APPS`
|
||||
|
||||
---
|
||||
|
||||
## Workbench Inline-Actions — 8 Module
|
||||
|
||||
Statt jedes Modul nur als ListView zu rendern, bekommen jetzt 8 Module direkte Inline-Aktionen im Workbench:
|
||||
|
||||
| Modul | Inline-Action |
|
||||
| --------- | ----------------------------------------- |
|
||||
| Inventory | Quick Item Creation |
|
||||
| Picture | Inline Upload |
|
||||
| Moodlit | Inline Mood Creation |
|
||||
| Context | Inline Document Creation |
|
||||
| Events | Detail Overlay via ViewProps |
|
||||
| Who | Inline Game Play + Detail |
|
||||
| Body | (bereits mit Routinen) |
|
||||
| Chat | Workbench Detail Overlay mit Streaming AI |
|
||||
|
||||
### Chat: AI-Streaming im Workbench
|
||||
|
||||
Die Chat-Detail-Seite bekommt Streaming-AI-Completions:
|
||||
|
||||
- Vercel AI SDK wired für streaming
|
||||
- Workbench-Detail-Overlay zeigt den Chat inline
|
||||
- Auth-Header + Template-System-Prompts + Streaming-Debounce
|
||||
- `api/who`: Server-side Validation des `[IDENTITY_REVEALED]` Sentinel
|
||||
|
||||
### Who-Dossier-System
|
||||
|
||||
Das Who-Modul (Charakter-Ratespiel) bekommt ein Dossier-System:
|
||||
|
||||
- **Staged Fact Disclosure**: Fakten werden stufenweise enthüllt, nicht alle auf einmal
|
||||
- **Inline Play**: Who-Games direkt auf der Workbench-Page spielbar
|
||||
- Chat-Bubble Tailwind-Klassen von v3 → v4 migriert
|
||||
- `createdAt` + simple `gameId` Index für Messages
|
||||
|
||||
---
|
||||
|
||||
## Wire-Format Envelope Versioning + Prompt-Cache
|
||||
|
||||
Der API-Server (`@mana/api`) bekommt zwei Architektur-Verbesserungen:
|
||||
|
||||
### Envelope Versioning
|
||||
|
||||
Jeder API-Response wird in ein versioniertes Envelope gewrapped:
|
||||
|
||||
```json
|
||||
{
|
||||
"version": 1,
|
||||
"data": { ... },
|
||||
"meta": { "requestId": "...", "timestamp": "..." }
|
||||
}
|
||||
```
|
||||
|
||||
Damit können Breaking Changes am Response-Format versioniert werden ohne bestehende Clients zu brechen.
|
||||
|
||||
### Anthropic Prompt-Cache Hints
|
||||
|
||||
Für AI-Endpoints die Anthropic-Modelle nutzen: Cache-Control-Hints im System-Prompt damit wiederholte Aufrufe den Prompt-Cache treffen. Reduziert Latenz und Kosten.
|
||||
|
||||
### Zod-Schemas für AI Structured Outputs
|
||||
|
||||
Neue `@mana/shared-types` Zod-Schemas für alle AI-Structured-Output-Formate. Die API-Routes konsumieren die Schemas via `z.infer<typeof schema>` statt manueller Typen. Nutriphi/Planta Vision-Routes komplett auf Vercel AI SDK + Zod migriert.
|
||||
|
||||
---
|
||||
|
||||
## Cloudflare-Tunnel-Rebuild
|
||||
|
||||
Drei Commits für Infrastructure-Hardening:
|
||||
|
||||
1. **Single Source of Truth**: `cloudflared-config.yml` wird zum einzigen Ort für Tunnel-Konfiguration
|
||||
2. **Smarter Rebuild**: Apex-Domain via API + sane Health-Probes statt alle Probes gleichzeitig
|
||||
3. **Pre-Commit-Validator**: Neuer Hook validiert die Tunnel-Config vor jedem Commit — syntaktisch und semantisch (keine doppelten Hostnames, keine fehlenden Services)
|
||||
|
||||
---
|
||||
|
||||
## Sync-Debug-Runbook + Silent Push Failures
|
||||
|
||||
### Runbook
|
||||
|
||||
Neues `SYNC_DEBUG` Runbook in `docs/sync/` mit einem neuen Debug-API in mana-sync:
|
||||
|
||||
- Schritt A: Client-Side Debug-Info exponieren
|
||||
- Schritt B: Server-Side Query per User
|
||||
- Schritt C: Neue Debug-API mit `GET /debug/user/:userId/changes`
|
||||
|
||||
### Silent Push Failures
|
||||
|
||||
Das Problem: Sync-Pushes scheiterten still — kein UI-Feedback, kein Toast, kein Log. Jetzt:
|
||||
|
||||
- Debug-Info in der Sync-Status-Anzeige
|
||||
- Silent Push Failures als Toast + console.warn surfacen
|
||||
|
||||
---
|
||||
|
||||
## 270 Warnings auf Null
|
||||
|
||||
Größter Warning-Sweep bisher:
|
||||
|
||||
- `da03fac72` — Alle 270 Svelte-Check Warnings in mana/web + allen Packages auf null
|
||||
- Hauptsächlich: unused imports, missing types, deprecated API usage
|
||||
- Includes Packages: `shared-auth`, `shared-llm`, `shared-branding`
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Features + Fixes
|
||||
|
||||
| Bereich | Was |
|
||||
| -------------------- | --------------------------------------------------------------------------------- |
|
||||
| Guides | Komplettes Modul mit Types, CRUD, Detail-View, Run-Tracking |
|
||||
| Zitare | Smooth Transitions, Custom Quotes, Notes, neue Kategorien, Fuzzy Search |
|
||||
| Memoro | Title-Source-Label unter dem Title-Input |
|
||||
| Architecture Cleanup | liveQuery Migration, Dead Types, Seed Registry |
|
||||
| Shared Voice | Geteilter Voice-Transcription-Helper für alle Module |
|
||||
| Workbench Registry | Body, Events, Who, Guides in den App-Registry eingetragen |
|
||||
| mana-llm | `response_format` Support im ChatCompletionRequest + Ollama Strip-Markdown-Fences |
|
||||
| shared-llm | Bump Default-Model auf `gemma4:e4b` + Fallback auf `message.reasoning` |
|
||||
| mana-media | Initial Schema-Migration committed + Run-on-Startup |
|
||||
| Help | Broken Imports gefixt + SupportedLanguage Typing |
|
||||
| shared-auth | Passkey/2FA/Session Methods durch ManaAuthStore proxied |
|
||||
| Api Dockerfile | @mana/shared-types in Build-Context kopiert |
|
||||
| inventar → inventory | Rename über die ganze Codebase |
|
||||
| shared-branding | APP_URLS aus APP_ICONS abgeleitet, Who-Entry nachgetragen |
|
||||
| API Deploy | `mana-api.mana.how` statt `api.mana.how` (Konflikt-Vermeidung) |
|
||||
| Sync | Fresh Writes sofort pushen via Listener-Bridge |
|
||||
| AiSettings | h2/h3 durch div ersetzt (semantische Korrektheit) |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| ----------------------------------- | -------------- |
|
||||
| Commits | 143 |
|
||||
| Files changed | 833 |
|
||||
| LOC added | ~40.850 |
|
||||
| LOC removed | ~22.380 |
|
||||
| Net | +18.470 |
|
||||
| Neue Module | 2 (News, Body) |
|
||||
| Module mit Workbench Inline-Actions | 8 |
|
||||
| Warnings eliminated | 270 |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **AI-Vision braucht strukturierte Schemas**: Ohne Zod-Validierung halluziniert das Vision-Modell Felder die im Frontend crashen. Vercel AI SDK + Zod ist die richtige Abstraktion — type-safe bis zum UI.
|
||||
|
||||
2. **Silent Failures sind schlimmer als laute Errors**: Sync-Pushes die still scheitern sind für den User unsichtbar — Daten gehen verloren ohne Feedback. Jedes I/O-System braucht Failure-Surfacing.
|
||||
|
||||
3. **Pre-Commit-Validators für Infrastructure-as-Code**: Eine kaputte Tunnel-Config deployed erst nach 10 Minuten Build — der Pre-Commit-Hook fängt das in Sekunden.
|
||||
|
|
@ -0,0 +1,247 @@
|
|||
---
|
||||
title: 'Journal-Modul, Sync-Billing Phase 2, Self-Hosted Geocoding, 215 A11y-Fixes'
|
||||
description: 'Neues Journal-Modul mit Voice + Mood + Encryption, Sync-Billing mit Server-Side Billing-Gate + Cron-Charging, Self-Hosted Geocoding mit Pelias (DACH), Firsts-Modul, 215 A11y-Suppressions durch echte Fixes ersetzt, Credits-Vereinfachung, TimeBlocks-Integration für 9 Module.'
|
||||
date: 2026-04-10
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'journal',
|
||||
'sync',
|
||||
'billing',
|
||||
'geocoding',
|
||||
'pelias',
|
||||
'a11y',
|
||||
'credits',
|
||||
'timeblocks',
|
||||
'firsts',
|
||||
'workbench',
|
||||
'docker',
|
||||
]
|
||||
featured: true
|
||||
commits: 53
|
||||
readTime: 16
|
||||
stats:
|
||||
filesChanged: 556
|
||||
linesAdded: 22514
|
||||
linesRemoved: 3220
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 53
|
||||
workingHours:
|
||||
start: '2026-04-10T09:00'
|
||||
end: '2026-04-10T22:00'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Journal-Modul** — Tagebuch mit Voice-Capture, Mood-Tracking und Encryption
|
||||
- **Sync-Billing Phase 2** — Server-Side Billing-Gate, Cron-basiertes Credit-Charging, E-Mail-Benachrichtigungen
|
||||
- **Self-Hosted Geocoding** mit Pelias (DACH-Region) — Autocomplete, Reverse-Geocoding, Auto-Kategorisierung
|
||||
- **Firsts-Modul** — "Erstes Mal"-Tracking von Traum bis Realität
|
||||
- **215 A11y-Suppressions** durch echte Fixes ersetzt
|
||||
- **Credits-Vereinfachung** — Productivity Credits, Guild Pools und komplexe Gift-Types entfernt
|
||||
- **TimeBlocks-Integration** für 9 weitere Module
|
||||
- **Workbench-Redesign** — Page Cards mit runden Ecken, unified Header, DnD entfernt
|
||||
|
||||
---
|
||||
|
||||
## Journal-Modul
|
||||
|
||||
Neues Modul `journal` in `$lib/modules/journal/`:
|
||||
|
||||
- **Voice-Capture**: VoiceCaptureBar-Integration für gesprochene Einträge
|
||||
- **Mood-Tracking**: Stimmung pro Eintrag (1–5 Skala mit Emoji-Feedback)
|
||||
- **Encryption**: Alle Einträge AES-GCM-256 verschlüsselt (Registry + Store korrekt verdrahtet)
|
||||
- **Dexie-Collections**: `journalEntries` mit `userId`, `createdAt`, `mood`, `content`, `tags`
|
||||
- **Workbench-Integration**: ListView mit Inline-Erstellung
|
||||
|
||||
Das Journal unterscheidet sich bewusst von Notes: Notes sind Arbeitsdokumente (Markdown, Tags, Referenzen), das Journal ist chronologisch, stimmungsbezogen und persönlicher.
|
||||
|
||||
---
|
||||
|
||||
## Sync-Billing Phase 2 — Server-Side Gate + Cron Charging
|
||||
|
||||
### Phase 1 Recap (Credits)
|
||||
|
||||
`mana-credits` Service bekommt Sync-Billing: monatliches Credit-Abo für Cloud-Sync. Neue Subscription-Tabelle, Activation/Cancellation-Flow, Admin-Gifted Subscriptions.
|
||||
|
||||
### Phase 2: Server-Side Enforcement
|
||||
|
||||
Die wichtigere Hälfte — der Server-Side Billing-Gate in `mana-sync`:
|
||||
|
||||
1. **Billing-Middleware**: Jeder Sync-Push prüft ob der User ein aktives Sync-Abo hat. Ohne Abo → 402 Payment Required mit Link zur Credits-Page
|
||||
2. **Cron-Charging**: Täglicher Cron-Job berechnet den anteiligen Credit-Verbrauch pro aktivem Sync-Abo
|
||||
3. **E-Mail-Benachrichtigungen**: Low-Balance-Warning + Subscription-Expiry via `mana-notify`
|
||||
4. **Docs**: mana-sync CLAUDE.md aktualisiert mit Billing-Middleware, neuen Env-Vars, Projektstruktur
|
||||
|
||||
### Sync UI
|
||||
|
||||
- **Sync-Status PillNav Dropdown**: Der Sync-Status ist jetzt über einen PillNav-Dropdown sichtbar — Pending Changes, Last Sync, Subscription-Status
|
||||
- **Onboarding-Step**: Neuer Onboarding-Schritt für Cloud-Sync mit Erklärung + Upgrade-CTA
|
||||
- **Batched Push**: `PUSH_BATCH_SIZE = 200` — große Sync-Pushes werden in 200er-Batches gesplittet statt als Monolith gesendet
|
||||
|
||||
---
|
||||
|
||||
## Self-Hosted Geocoding mit Pelias
|
||||
|
||||
Statt auf Google Maps oder Mapbox zu setzen, hosten wir Geocoding selbst mit **Pelias** (Open-Source, OpenStreetMap-basiert):
|
||||
|
||||
### Setup
|
||||
|
||||
- **DACH-only Import**: Pelias-Config auf Deutschland, Österreich, Schweiz beschränkt. Spart 80% Storage vs. Welt-Import
|
||||
- **Single-Country Filter**: Nur DACH-Ergebnisse werden zurückgegeben
|
||||
- **Docker-Compose**: Pelias-Stack (Elasticsearch, PIP, Placeholder, Interpolation, API) in der prod compose
|
||||
|
||||
### Features
|
||||
|
||||
- **Autocomplete**: Live-Suche während der Eingabe in Places
|
||||
- **Reverse-Geocoding**: GPS-Koordinaten → Adresse (für Location-Tracking)
|
||||
- **Auto-Kategorisierung**: Pelias-Taxonomy mapped OSM-Kategorien auf Places-Kategorien (Restaurant, Café, Park, ...)
|
||||
- **Fallback**: Wenn `/autocomplete` leer ist → `/search` als Fallback
|
||||
|
||||
### Places-Integration
|
||||
|
||||
- **Clickable Tracking-Label**: Zeigt die aktuelle Adresse während GPS-Tracking
|
||||
- **Full Address Display**: Vollständige Adresse statt nur Koordinaten
|
||||
- **Browser-Proxy**: Geocoding-Requests laufen über den SvelteKit-Proxy (CORS)
|
||||
|
||||
### Cross-Module
|
||||
|
||||
Geocoding wurde auch in Events, Contacts und Photos integriert — überall wo Orte relevant sind.
|
||||
|
||||
### Infra
|
||||
|
||||
- Pelias Health über den Wrapper für Monitoring proxied
|
||||
- libpostal nicht auf Host-Port 4400 binden (Konflikt-Vermeidung)
|
||||
- Unit-Tests + E2E-Smoke-Test-Script
|
||||
- Docs: Pelias-Category-Patch + Import-Gotchas
|
||||
|
||||
---
|
||||
|
||||
## Firsts-Modul — "Erstes Mal"-Tracker
|
||||
|
||||
Neues Modul `firsts` für die Dokumentation von "ersten Malen":
|
||||
|
||||
- **Dream-to-Lived Tracking**: Träume (aus dem Dreams-Modul) werden zu erlebten Firsts
|
||||
- **Design-Dokument**: `docs/firsts/` mit Feature-Beschreibung + Datenmodell
|
||||
- **Fix**: Invalid JS-Comment in CSS-Block entfernt (Build-Blocker)
|
||||
|
||||
---
|
||||
|
||||
## 215 A11y-Fixes
|
||||
|
||||
Commit `b8cd33df7` — der größte Accessibility-Sweep bisher:
|
||||
|
||||
Alle 215 `// eslint-disable-next-line` A11y-Suppressions im Code durch echte Fixes ersetzt:
|
||||
|
||||
- `on:click` auf non-interactive Elements → `<button>` oder `role="button"` + `tabindex`
|
||||
- Missing `alt` Texte auf Images
|
||||
- Missing `aria-label` auf Icon-Buttons
|
||||
- `<div>` als Click-Handler → semantische HTML-Elemente
|
||||
- Calendar: Event-Rows als `<button>` statt `<div>` für Keyboard-Navigation
|
||||
|
||||
---
|
||||
|
||||
## Credits-Vereinfachung
|
||||
|
||||
Das Credit-System wurde drastisch vereinfacht:
|
||||
|
||||
**Entfernt:**
|
||||
|
||||
- Productivity Credits (automatische Credits für App-Nutzung)
|
||||
- Guild Pools (Team-basierte Credit-Verteilung)
|
||||
- Komplexe Gift-Types (Multi-Code-Redemption, Conditional Gifts)
|
||||
|
||||
**Behalten:**
|
||||
|
||||
- Simple Credit-Balance
|
||||
- Sync-Subscription
|
||||
- Admin-Gifted Credits/Subscriptions
|
||||
|
||||
Die entfernten Features waren over-engineered für den aktuellen Nutzungsumfang. Wenn sie gebraucht werden, können sie als eigene Module zurückkommen statt das Credit-System zu overloaden.
|
||||
|
||||
---
|
||||
|
||||
## TimeBlocks-Integration für 9 Module
|
||||
|
||||
Drei Commits integrieren TimeBlocks in 9 weitere Module:
|
||||
|
||||
| Commit | Module |
|
||||
| ---------- | --------------------------------- |
|
||||
| `6ee1df39` | Planta, Dreams, Skilltree, Cycles |
|
||||
| `29ad31c4` | Guides, Places, Cards |
|
||||
| `cbfe995f` | Music, Moodlit, Presi |
|
||||
|
||||
Damit können alle diese Module Aktivitäten als TimeBlocks im Calendar anzeigen.
|
||||
|
||||
---
|
||||
|
||||
## Workbench-Redesign
|
||||
|
||||
### Page Cards
|
||||
|
||||
Redesign der Workbench Page-Cards:
|
||||
|
||||
- **Runde Ecken** statt scharfe Kanten
|
||||
- **Unified Header**: Konsistenter Header über alle Page-Cards
|
||||
- **DnD entfernt**: Drag-and-Drop für Page-Reihenfolge war UX-mäßig verwirrend und wurde nie genutzt
|
||||
|
||||
### Bottom Bar
|
||||
|
||||
`SceneTabs` und `MinimizeTabs` wurden durch eine **unified Bottom Bar** ersetzt — ein Bar für alle Workbench-Navigationsaktionen.
|
||||
|
||||
---
|
||||
|
||||
## Dev-Experience Fixes
|
||||
|
||||
| Fix | Detail |
|
||||
| ---------------------------- | ------------------------------------------------------ |
|
||||
| Redis Eviction Policy | Dev-Startup crashed nicht mehr bei vollem Redis |
|
||||
| mana-media Port Crash | Port-Konflikt beim Restart behoben |
|
||||
| Svelte Warnings | Warnings beim Dev-Start suppressed |
|
||||
| AZURE_OPENAI_API_KEY Warning | Falscher Warning für lokale Devs ohne Azure |
|
||||
| mana-media Dev Startup | Shortcut für schnelleren Dev-Start |
|
||||
| db:push Reporting | Ehrliches Reporting ob Schema-Pushes erfolgreich waren |
|
||||
| Tier-Test-Patch | Revert des All-Guest-Patches + widen toggleField |
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Fixes
|
||||
|
||||
| Fix | Detail |
|
||||
| ---------------- | -------------------------------------------------------- |
|
||||
| Guides Build | `{@const}` aus `<div>` verschoben (Svelte 5 Build-Error) |
|
||||
| Guides Export | Stub GUIDES Export damit Build passt |
|
||||
| as-any Cleanup | as-any Casts über die Codebase aufgeräumt |
|
||||
| spiral-db | Prepare-Script für spiral-db hinzugefügt |
|
||||
| Locale Typing | Locale-Types über die Codebase vereinheitlicht |
|
||||
| AI Tier Selector | Dropdown in PillNavigation für AI-Tier-Auswahl |
|
||||
| Playground | Persistent Chat History, Token Display, Model Comparison |
|
||||
| Top-5 ROI | CI Gate, Auth Fields, Body×TimeBlocks, Sync Pull, Tests |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| --------------------- | ------------------- |
|
||||
| Commits | 53 |
|
||||
| Files changed | 556 |
|
||||
| LOC added | ~22.510 |
|
||||
| LOC removed | ~3.220 |
|
||||
| Net | +19.290 |
|
||||
| Neue Module | 2 (Journal, Firsts) |
|
||||
| A11y-Fixes | 215 |
|
||||
| Module mit TimeBlocks | +9 |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **A11y-Suppressions sind technische Schuld**: 215 Suppressions hatten sich über Monate angesammelt. Der Sweep dauerte einen halben Tag — hätte aber viel weniger gedauert wenn jede Suppression sofort gefixt worden wäre. Ab jetzt: Zero-Suppression-Policy.
|
||||
|
||||
2. **Self-Hosted Geocoding lohnt sich ab dem dritten Modul**: Für Places allein wäre ein Mapbox-API-Key einfacher. Aber mit Events + Contacts + Photos nutzen vier Module die gleiche Instanz — kein API-Budget, keine Rate-Limits, DSGVO-konform.
|
||||
|
||||
3. **Feature-Simplification > Feature-Addition**: Das Credit-System zu vereinfachen war produktiver als neue Credit-Features zu bauen. Weniger Code = weniger Bugs = schnellere Iteration.
|
||||
|
|
@ -0,0 +1,259 @@
|
|||
---
|
||||
title: 'Journal-Modul, Sync-Billing, Credits-Vereinfachung, Geocoding + Workbench-Redesign'
|
||||
description: 'Journal-Modul mit Voice-Capture und Mood-Tracking. Sync bekommt serverseitiges Billing mit Cron-Charging. Credits-System radikal vereinfacht. Places-Modul mit self-hosted Pelias-Geocoding (DACH). Workbench-Redesign: unified Bottom-Bar, neue Page-Cards, Settings-Redesign. 215 A11y-Suppressions durch echte Fixes ersetzt.'
|
||||
date: 2026-04-10
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'journal',
|
||||
'sync',
|
||||
'billing',
|
||||
'credits',
|
||||
'geocoding',
|
||||
'pelias',
|
||||
'workbench',
|
||||
'a11y',
|
||||
'firsts',
|
||||
'timeblocks',
|
||||
'settings',
|
||||
]
|
||||
featured: true
|
||||
commits: 53
|
||||
readTime: 16
|
||||
stats:
|
||||
filesChanged: 556
|
||||
linesAdded: 22514
|
||||
linesRemoved: 3220
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 53
|
||||
workingHours:
|
||||
start: '2026-04-10T09:00'
|
||||
end: '2026-04-10T22:00'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Journal-Modul** mit Voice-Capture, Mood-Tracking und Encryption live
|
||||
- **Sync Phase 2**: serverseitiges Billing-Gate, Cron-Charging, E-Mail-Benachrichtigungen, Batched Push mit `PUSH_BATCH_SIZE=200`
|
||||
- **Credits radikal vereinfacht**: Productivity-Credits, Guild-Pools und komplexe Gift-Types rausgeworfen
|
||||
- **Self-hosted Geocoding** mit Pelias (DACH-only) — Places, Events, Contacts, Photos können jetzt reverse-geocoden
|
||||
- **Workbench-Redesign**: unified Bottom-Bar ersetzt Minimize-Tabs + Scene-Tabs, neue Page-Cards mit runden Ecken
|
||||
- **Firsts-Modul**: Dream-to-Lived-Tracking ("Erstes Mal X gemacht")
|
||||
- **215 A11y-Suppression-Comments** durch echte Fixes ersetzt
|
||||
- **Settings-Page Redesign** mit PillNav-Compute-Selector
|
||||
|
||||
---
|
||||
|
||||
## Journal — Voice-Capture + Mood-Tracking
|
||||
|
||||
Neues Modul `modules/journal/` — ein tägliches Journal mit drei Kernfeatures:
|
||||
|
||||
1. **Voice-Capture** via die geteilte `<VoiceCaptureBar>` — sprich deinen Eintrag, STT transkribiert, Text wird als Eintrag gespeichert
|
||||
2. **Mood-Tracking** — Stimmung pro Eintrag mit 5-Punkt-Skala + optionale Tags
|
||||
3. **Encryption** — alle Einträge AES-GCM-256 verschlüsselt wie alle anderen User-Content-Module
|
||||
|
||||
Standard-Module-Pattern: `collections.ts`, `queries.ts`, `stores/journal.svelte.ts`, `module.config.ts`. Dexie-Tabellen: `journalEntries`. Dashboard-Widget zeigt den letzten Eintrag + Mood-Trend.
|
||||
|
||||
---
|
||||
|
||||
## Sync Phase 2 — Server-Side Billing
|
||||
|
||||
Bis jetzt war Sync ein reines Push/Pull-Protokoll ohne Kosten-Gate. Ab heute zahlen User für Cloud-Sync per Credits:
|
||||
|
||||
### Server-Side Billing-Gate
|
||||
|
||||
`mana-sync` (Go) bekommt Billing-Middleware:
|
||||
- Prüft vor jedem Push ob der User eine aktive Sync-Subscription hat
|
||||
- Subscription wird über `mana-credits` verwaltet
|
||||
- Cron-Job charged monatlich — kein Prepaid, sondern Post-Paid mit Grace-Period
|
||||
|
||||
### Credits: Sync-Billing
|
||||
|
||||
Neuer Credit-Typ `sync_subscription` in `mana-credits`. Monthly-Credit-Subscription für Cloud-Sync. Admin kann Sync-Subscriptions giften (für Beta-User).
|
||||
|
||||
### E-Mail-Benachrichtigungen
|
||||
|
||||
User bekommen E-Mails bei:
|
||||
- Subscription-Aktivierung
|
||||
- Niedrigem Credit-Balance (Warning)
|
||||
- Subscription-Ablauf
|
||||
|
||||
### Batched Push
|
||||
|
||||
`PUSH_BATCH_SIZE = 200` — statt alle pending Changes in einem Request zu schicken, werden sie in 200er-Batches aufgeteilt. Verhindert Timeouts bei großen initialen Syncs.
|
||||
|
||||
### Sync-Status UI
|
||||
|
||||
Neues PillNav-Dropdown zeigt den Sync-Status (connected, syncing, error) + Onboarding-Step für neue User die Sync noch nicht aktiviert haben.
|
||||
|
||||
### Dokumentation
|
||||
|
||||
`mana-sync` CLAUDE.md aktualisiert mit Billing-Middleware, neuen Env-Vars, Projektstruktur.
|
||||
|
||||
---
|
||||
|
||||
## Credits — Radikale Vereinfachung
|
||||
|
||||
Das Credit-System war overengineered:
|
||||
|
||||
**Gelöscht**:
|
||||
- Productivity-Credits (automatisch verdient durch App-Nutzung)
|
||||
- Guild-Pools (geteilte Credit-Töpfe)
|
||||
- Komplexe Gift-Types (Promo-Codes, Referral-Bonuses, …)
|
||||
|
||||
**Behalten**:
|
||||
- Simple Credit-Balance
|
||||
- Admin-Gifting
|
||||
- Sync-Subscription als einziger Abo-Typ
|
||||
|
||||
Resultat: **-2.200 LOC** im Credits-Modul, deutlich weniger cognitive Load für User und Entwickler.
|
||||
|
||||
---
|
||||
|
||||
## Geocoding — Self-Hosted Pelias (DACH)
|
||||
|
||||
### Warum Self-Hosted?
|
||||
|
||||
Kein externer Geocoding-Provider (Google Maps, Mapbox) wegen Privacy. Pelias ist Open-Source, läuft lokal, und kann mit OpenStreetMap-Daten für DACH (Deutschland, Österreich, Schweiz) gefüttert werden.
|
||||
|
||||
### Setup
|
||||
|
||||
- **Pelias-Stack**: Elasticsearch + Pelias-API + Placeholder + Interpolation + PIP + libpostal
|
||||
- **DACH-Only Import** — Pelias-Config auf `DE`, `AT`, `CH` eingeschränkt. Single-Country-Filter im API-Wrapper.
|
||||
- **Auto-Kategorisierung** via Pelias-Taxonomy — Adressen bekommen automatisch Kategorien (Restaurant, Park, Schule, …)
|
||||
|
||||
### Integration
|
||||
|
||||
Geocoding wird in vier Module integriert:
|
||||
- **Places** — Reverse-Geocoding beim Tracking, Klickbares Location-Label mit voller Adresse, Browser-Proxy für die API
|
||||
- **Events** — Veranstaltungsort wird geocoded
|
||||
- **Contacts** — Adressfeld wird geocoded
|
||||
- **Photos** — GPS-Koordinaten aus EXIF werden reverse-geocoded
|
||||
|
||||
### Fixes während der Integration
|
||||
|
||||
| Fix | Detail |
|
||||
|---|---|
|
||||
| Pelias /autocomplete leer | Fallback auf `/search` wenn `/autocomplete` keine Ergebnisse liefert |
|
||||
| libpostal Port-Conflict | Host-Port 4400 nicht mehr gebunden |
|
||||
| Pelias Health | Health-Endpoint durch Wrapper geproxied für Monitoring |
|
||||
| Unused Services | Überflüssige Pelias-Services gedroppt, Bun idleTimeout erhöht |
|
||||
| DACH-Only | Config auf DACH eingeschränkt, Single-Country-Filter |
|
||||
|
||||
### Monitoring
|
||||
|
||||
Pelias + mana-geocoding in Production-Compose, Prometheus, Grafana und status.mana.how integriert. Unit-Tests + End-to-End-Smoke-Test-Script. CLAUDE.md mit Deploy-Lessons-Learned und Pelias-Category-Patch-Doku.
|
||||
|
||||
---
|
||||
|
||||
## Workbench-Redesign
|
||||
|
||||
### Unified Bottom-Bar
|
||||
|
||||
Minimize-Tabs und Scene-Tabs waren zwei separate UI-Elemente am unteren Rand. Jetzt ersetzt durch eine **unified Bottom-Bar** die beides in einem Element kombiniert. Weniger visuelles Noise, mehr Platz für Content.
|
||||
|
||||
### Page-Cards Redesign
|
||||
|
||||
Neue Cards mit:
|
||||
- Runde Ecken (8px → 12px)
|
||||
- Unified Header (Icon + Title + Actions)
|
||||
- DnD entfernt — wurde nie genutzt und machte Touch-Scrolling kaputt
|
||||
|
||||
### AppPagePicker
|
||||
|
||||
Design an Module-Pages angepasst — gleiche Card-Styles, gleiche Spacing.
|
||||
|
||||
### Settings-Redesign
|
||||
|
||||
Settings-Page komplett umgebaut:
|
||||
- PillNav-Compute-Selector für AI-Tier-Auswahl
|
||||
- Inline-Section statt ausgelagerte Sub-Routes
|
||||
- Konsistentes Section-Header-Design
|
||||
|
||||
---
|
||||
|
||||
## Firsts — Dream-to-Lived-Tracking
|
||||
|
||||
Neues Modul `modules/firsts/` — trackt "Erste Male":
|
||||
|
||||
- Erstelle Dinge die du zum ersten Mal erleben willst
|
||||
- Markiere sie als "erlebt" mit Datum und Notizen
|
||||
- Design-Dokument mit Feature-Backlog
|
||||
|
||||
Kleiner Fix: ein JS-Comment war in einem CSS-Block gelandet und brach den Build.
|
||||
|
||||
---
|
||||
|
||||
## TimeBlocks-Integration
|
||||
|
||||
Drei weitere Modul-Gruppen in TimeBlocks integriert:
|
||||
- **Music, Moodlit, Presi** — Musik-Sessions, Stimmungs-Logs, Präsentations-Timeslots
|
||||
- **Guides, Places, Cards** — Guide-Runs, Orts-Besuche, Lernkarten-Sessions
|
||||
- **Planta, Dreams, Skilltree, Cycles** — Pflanzenpflege, Traum-Logs, Skill-Sessions, Zyklus-Events
|
||||
|
||||
Zwei Guides-Fixes nötig:
|
||||
- `{@const}` aus `<div>` verschoben (Svelte 5 Build-Error)
|
||||
- Stub `GUIDES` Export damit der Build durchgeht
|
||||
|
||||
---
|
||||
|
||||
## Accessibility
|
||||
|
||||
**215 `a11y-`-Suppression-Comments** durch echte Fixes ersetzt. Die suppressions waren ein "wir kümmern uns später"-Pattern aus der schnellen Feature-Phase. Heute wurde "später" zu "jetzt":
|
||||
|
||||
- Missing `alt`-Attributes auf Images
|
||||
- Missing `aria-label` auf Icon-Buttons
|
||||
- Interactive Elements ohne Keyboard-Support
|
||||
- Missing `role` Attributes
|
||||
- Calendar: `<button>` statt `<div>` für Event-Rows
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Fixes + DevEx
|
||||
|
||||
| Fix | Detail |
|
||||
|---|---|
|
||||
| Dev-Startup | Redis eviction-policy, mana-media Port-Crash, Svelte-Warnings |
|
||||
| DX | mana-media Dev-Startup-Chain verkürzt, AZURE_OPENAI_API_KEY-Warning unterdrückt |
|
||||
| Tier-Patch | Test-Patch reverted, `toggleField` gewidened, spiral-db prepare |
|
||||
| AI-Tier | AI-Tier-Selector-Dropdown in PillNavigation |
|
||||
| Top-5 ROI | CI-Gate, Auth-Fields, Body×TimeBlocks, Sync-Pull, Tests |
|
||||
| Chat | Auth-Header, Template-System-Prompts, Streaming-Debounce |
|
||||
| Playground | Persistent Chat-History, Token-Display, Model-Comparison |
|
||||
| Zitare | Smooth Transitions, Custom Quotes, Notes, neue Kategorien, Fuzzy-Search |
|
||||
| Architecture | liveQuery-Migration, Dead Types, Seed-Registry Cleanup |
|
||||
| E2E | Smoke-Test, Lazy Widget Loading, Typed Module Context |
|
||||
| svelte-check | 14 pre-existing Type-Errors resolved |
|
||||
| Monitoring | 10 fehlende Module zu Blackbox-Probes + Geocoding zu Status |
|
||||
| Docker | mana-credits Dockerfile komplett umgeschrieben (multi-stage, pnpm, WORKDIR) |
|
||||
| mana-sync | Dockerfile: shared-go Dependency kopieren, Go 1.25 Base-Image |
|
||||
| Status-Page | Shell-Kompatibilität: `set -e` drop, `set -u` Safety, ash-compatible Loop |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Commits | 53 |
|
||||
| Files changed | 556 |
|
||||
| LOC added | ~22.500 |
|
||||
| LOC removed | ~3.200 |
|
||||
| Net | +19.300 |
|
||||
| Neue Module | 2 (Journal, Firsts) |
|
||||
| A11y-Suppressions eliminiert | 215 |
|
||||
| LOC entfernt (Credits) | ~2.200 |
|
||||
| TimeBlock-Integrationen | 12 Module |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Self-hosted Geocoding ist ein Infra-Projekt, kein Feature-Commit**. Pelias braucht Elasticsearch, libpostal, OpenStreetMap-Imports — allein das Setup sind 10+ Config-Files. Aber die Privacy-Garantie ist es wert.
|
||||
|
||||
2. **A11y-Suppressions akkumulieren schnell** wenn man sie als "later"-Marker benutzt. 215 in ~3 Monaten. Der Fix-Sweep dauerte länger als erwartet, weil viele Suppressions echte UX-Probleme kaschierten (Buttons ohne Keyboard-Support).
|
||||
|
||||
3. **Credit-Systeme neigen zu Overengineering**. Productivity-Credits, Guild-Pools, Promo-Codes — alles gut gemeint, keins davon wurde je von einem User benutzt. Die Vereinfachung auf "Credits + Admin-Gift" deckt 100% der aktuellen Use-Cases ab.
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
---
|
||||
title: 'Settings-Redesign, Geocoding-Deploy, Monitoring-Ausbau + Status-Page-Hardening'
|
||||
description: 'Settings-Page komplett redesigned mit PillNav-Compute-Selector, Geocoding-Deploy auf Prod mit Pelias + Prometheus + Grafana, 10 fehlende Module in Blackbox-Probes, Status-Page Shell-Kompatibilität, mana-credits + mana-sync Dockerfiles gefixt.'
|
||||
date: 2026-04-11
|
||||
author: 'Till Schneider'
|
||||
category: 'infrastructure'
|
||||
tags:
|
||||
[
|
||||
'settings',
|
||||
'geocoding',
|
||||
'pelias',
|
||||
'monitoring',
|
||||
'prometheus',
|
||||
'grafana',
|
||||
'status-page',
|
||||
'docker',
|
||||
'mana-credits',
|
||||
'mana-sync',
|
||||
]
|
||||
featured: false
|
||||
commits: 29
|
||||
readTime: 10
|
||||
stats:
|
||||
filesChanged: 108
|
||||
linesAdded: 4455
|
||||
linesRemoved: 1232
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 29
|
||||
workingHours:
|
||||
start: '2026-04-11T10:00'
|
||||
end: '2026-04-11T19:00'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Settings-Page Redesign** mit PillNav-Compute-Selector
|
||||
- **Geocoding-Deploy** auf Prod — Pelias in Prometheus + Grafana + status.mana.how
|
||||
- **10 fehlende Module** in Blackbox-Probes nachgetragen
|
||||
- **Status-Page Shell-Hardening** — ash-kompatibel, set -e/u safe
|
||||
- **mana-credits + mana-sync Dockerfiles** komplett überarbeitet
|
||||
- **Workbench Polish** — Paper-Grain-Textur, AppPagePicker-Design, Bottom-Stack-Spacing
|
||||
|
||||
---
|
||||
|
||||
## Settings-Page Redesign
|
||||
|
||||
Die Settings-Page wurde komplett neu designed:
|
||||
|
||||
- **PillNav-Compute-Selector**: Der AI-Compute-Tier (Browser / Server / Cloud / BYOK) ist jetzt über einen PillNav-Dropdown in den Settings wählbar
|
||||
- **Account-Dropdown**: User-Pills kollabiert in ein Account-Dropdown mit soliden Pill-Backgrounds
|
||||
- **Credits/Sync API**: Client zeigt auf `credits.mana.how` statt auf relative Pfade
|
||||
|
||||
---
|
||||
|
||||
## Geocoding-Deploy auf Prod
|
||||
|
||||
Der Self-Hosted Geocoding-Stack (Pelias) wurde auf dem Mac Mini deployed:
|
||||
|
||||
### Monitoring-Integration
|
||||
|
||||
- **Prometheus**: Pelias-Scrape-Target hinzugefügt
|
||||
- **Grafana**: Dashboard für Geocoding-Latenz + Request-Rate
|
||||
- **status.mana.how**: Geocoding als eigener Service-Check
|
||||
|
||||
### Geocoding-Hardening
|
||||
|
||||
Fünf Fixes nach dem ersten Prod-Deploy:
|
||||
|
||||
| Fix | Problem | Lösung |
|
||||
| --------------- | --------------------------------------------- | ------------------------------------------ |
|
||||
| Pelias Config | DACH-only Import nicht korrekt | Single-Country-Filter in der Pelias-Config |
|
||||
| Health-Proxy | Pelias-Health nicht erreichbar für Monitoring | Health-Endpoint durch den Wrapper proxied |
|
||||
| libpostal Port | Port 4400 Konflikt mit anderem Service | libpostal nicht auf Host-Port binden |
|
||||
| Unused Services | 3 Pelias-Services liefen unnötig | Entfernt, Bun idleTimeout erhöht |
|
||||
| Category-Patch | Pelias-Taxonomie incomplete | Auto-Kategorisierung via Taxonomy-Mapping |
|
||||
|
||||
### Doku
|
||||
|
||||
- `CLAUDE.md` mit Deploy-Lessons-Learned aktualisiert
|
||||
- Pelias-Category-Patch + Import-Gotchas dokumentiert
|
||||
|
||||
---
|
||||
|
||||
## Monitoring: 10 fehlende Module
|
||||
|
||||
Blackbox-Probes in Prometheus hatten 10 Module nicht überwacht. Nachgetragen:
|
||||
|
||||
- Geocoding als neuer Service
|
||||
- Die fehlenden 10 Web-Module mit Health-Checks
|
||||
|
||||
---
|
||||
|
||||
## Status-Page Shell-Hardening
|
||||
|
||||
Drei Fixes für die Status-Page (`status.mana.how`), die als Alpine-Container läuft:
|
||||
|
||||
1. **`set -e` entfernt**: Heredoc-Subshells triggern Silent Exits in ash
|
||||
2. **`${TIER_APPS:-}`**: Leere Variable mit `set -u` abgesichert
|
||||
3. **Multi-line awk → Shell Loop**: awk-Syntax nicht ash-kompatibel, durch einfache Shell-Loops ersetzt
|
||||
|
||||
---
|
||||
|
||||
## Docker: mana-credits + mana-sync
|
||||
|
||||
### mana-credits
|
||||
|
||||
Das Dockerfile wurde dreimal iteriert:
|
||||
|
||||
1. `WORKDIR` statt `cd` (Dockerfile-Best-Practice)
|
||||
2. `pnpm` statt `npm` für Workspace-Dependency-Resolution
|
||||
3. Multi-Stage Build mit `node+pnpm` Installer
|
||||
|
||||
Das Kernproblem: mana-credits ist ein pnpm-Workspace-Package und braucht den Workspace-Context für die `@mana/*` Dependencies. Ein plain `npm install` resolves die Workspace-Deps nicht.
|
||||
|
||||
### mana-sync
|
||||
|
||||
- Go Base Image auf 1.25 gebumpt (match go.mod)
|
||||
- `shared-go` Workspace-Dependency in den Build-Context kopiert
|
||||
|
||||
---
|
||||
|
||||
## Workbench Polish
|
||||
|
||||
### Paper-Grain-Textur
|
||||
|
||||
Neues visuelles Detail: die Workbench-Pages bekommen eine subtile Paper-Grain-Textur:
|
||||
|
||||
- CSS `mix-blend-mode` für den Grain-Overlay
|
||||
- Border mit Stone-Palette-Farben
|
||||
- Dynamische Page-Height + tighter Bottom-Stack-Spacing
|
||||
|
||||
### AppPagePicker
|
||||
|
||||
- Design matched jetzt die Module-Pages (gleiche Card-Styles, gleiche Spacing)
|
||||
- `@const` aus `{#if}` verschoben (Svelte 5 Snippet-Kompatibilität)
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Fixes
|
||||
|
||||
| Fix | Detail |
|
||||
| ---------------- | -------------------------------------------------------------- |
|
||||
| Safari CORS Hang | HTTP → HTTPS Redirect verbessert für Safari |
|
||||
| HTTPS Detection | Robustere HTTP-Detection für den Redirect |
|
||||
| presi db:push | Schema-Push für Presi via @mana/api verdrahtet |
|
||||
| Places | Reverse-Geocoded Location-Label + Full Address + Browser Proxy |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| ----------------- | --------------------------------- |
|
||||
| Commits | 29 |
|
||||
| Files changed | 108 |
|
||||
| LOC added | ~4.450 |
|
||||
| LOC removed | ~1.230 |
|
||||
| Net | +3.220 |
|
||||
| Docker-Fixes | 5 (mana-credits ×3, mana-sync ×2) |
|
||||
| Monitoring-Probes | +10 |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Alpine ash ≠ bash**: Status-Page-Scripts die auf macOS funktionieren crashen in Alpine-Containern. `set -e` + Heredocs, awk multi-line Syntax, und unset Variables verhalten sich alle anders. Immer im Container testen.
|
||||
|
||||
2. **Dockerfile-Iteration ist normal**: Das mana-credits Dockerfile brauchte drei Versuche. pnpm-Workspace-Dependencies in Docker-Builds sind nicht trivial — der erste Versuch ist fast nie der richtige.
|
||||
|
|
@ -0,0 +1,180 @@
|
|||
---
|
||||
title: 'UI-Redesign: Wallpaper-System, FloatingInputBar, PillNav Fullscreen + 4 neue Module'
|
||||
description: 'Großes UI-Redesign mit Wallpaper-System, sticky PageHeader, FloatingInputBar für 7 Module, PillNav Bar-Mode mit Fullscreen + Local STT, Drink-Modul, Landing /features Page, App-Icon-Refresh für 12 Module, planta → plants Rename.'
|
||||
date: 2026-04-12
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'ui',
|
||||
'wallpaper',
|
||||
'floating-input',
|
||||
'pillnav',
|
||||
'fullscreen',
|
||||
'local-stt',
|
||||
'drink',
|
||||
'landing',
|
||||
'features',
|
||||
'icons',
|
||||
'moodlit',
|
||||
]
|
||||
featured: true
|
||||
commits: 18
|
||||
readTime: 10
|
||||
stats:
|
||||
filesChanged: 232
|
||||
linesAdded: 8415
|
||||
linesRemoved: 2447
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 18
|
||||
workingHours:
|
||||
start: '2026-04-12T12:00'
|
||||
end: '2026-04-12T20:00'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Wallpaper-System** + sticky PageHeader — individualisierbare Hintergrundbilder für die App
|
||||
- **FloatingInputBar** — geteilte Floating-Input-Komponente, 7 Module migriert
|
||||
- **PillNav Bar Mode** mit Fullscreen, Local STT + Mic-Button
|
||||
- **Drink-Modul** — Getränke-Tracking mit Inline-Editing
|
||||
- **Moodlit Fullscreen** — Mood auf Klick als Fullscreen-Visual
|
||||
- **Landing /features Page** — USP-Seite mit Simple/Tech-Toggle
|
||||
- **App-Icons Refresh** für 12 Module
|
||||
- **planta → plants Rename** über die ganze Codebase
|
||||
|
||||
---
|
||||
|
||||
## Wallpaper-System + Sticky PageHeader
|
||||
|
||||
Neues visuelles Feature: Users können ein Hintergrundbild für die App setzen.
|
||||
|
||||
- **Wallpaper-Auswahl**: Mehrere vorinstallierte Wallpapers + Custom-Upload
|
||||
- **Sticky PageHeader**: Der Seitentitel bleibt beim Scrollen oben fixiert — mit leichtem Blur-Effekt über dem Wallpaper
|
||||
- **Theme-Token-Integration**: Hardcoded weiße Textfarben entfernt, alle Texte nutzen jetzt Theme-Tokens für Light/Dark-Mode Kompatibilität
|
||||
|
||||
---
|
||||
|
||||
## FloatingInputBar — Shared Component für 7 Module
|
||||
|
||||
Statt jedes Modul seinen eigenen Input-Bar implementieren zu lassen, gibt es jetzt eine geteilte `FloatingInputBar`-Komponente:
|
||||
|
||||
- **Floating Design**: Bar schwebt über dem Content, fixiert am unteren Rand
|
||||
- **Module-agnostisch**: Jedes Modul gibt nur Placeholder-Text und einen `onSubmit`-Handler
|
||||
|
||||
Migrierte Module:
|
||||
|
||||
1. Todo (minimal ListView-Redesign)
|
||||
2. Notes
|
||||
3. Contacts
|
||||
4. Calendar
|
||||
5. Inventory
|
||||
6. Habits
|
||||
7. Journal
|
||||
|
||||
Der Todo-ListView wurde im gleichen Zug redesigned — cleaner, weniger visuelles Rauschen.
|
||||
|
||||
---
|
||||
|
||||
## PillNav Bar Mode + Fullscreen + Local STT
|
||||
|
||||
Die PillNav-Leiste bekommt drei große Features:
|
||||
|
||||
### Bar Mode
|
||||
|
||||
Neuer kompakter Bar-Modus als Alternative zum Pill-Layout. Weniger Platz, gleiche Funktionalität.
|
||||
|
||||
### Fullscreen
|
||||
|
||||
Fullscreen-Toggle direkt in der PillNav — die App nimmt den ganzen Bildschirm ein, PillNav und PageHeader verschwinden für immersives Arbeiten.
|
||||
|
||||
### Local STT + Mic-Button
|
||||
|
||||
Ein Mic-Button in der PillNav startet lokale Speech-to-Text via `@mana/local-stt` (Whisper, WebGPU):
|
||||
|
||||
- STT-Routing: Wenn das lokale Whisper-Modell geladen ist → alles lokal, kein Server-Call
|
||||
- Fallback: Wenn kein lokales Modell → Server-STT via mana-stt
|
||||
- Docker-Fix: `local-stt` Package in das mana-web Dockerfile kopiert
|
||||
|
||||
---
|
||||
|
||||
## Drink-Modul
|
||||
|
||||
Neues Modul `drink` für Getränke-Tracking:
|
||||
|
||||
- **Beverage-Typen**: Wasser, Kaffee, Tee, Saft, Alkohol, ... mit Icons
|
||||
- **Inline-Editing**: Menge + Typ direkt in der Liste änderbar
|
||||
- **Tages-Übersicht**: Gesamtmenge pro Tag mit Fortschrittsbalken
|
||||
- **Workbench-Integration**: ListView mit Quick-Add
|
||||
|
||||
---
|
||||
|
||||
## Moodlit Fullscreen
|
||||
|
||||
Das Moodlit-Modul bekommt ein visuelles Upgrade:
|
||||
|
||||
- **Fullscreen on Click**: Mood-Card klicken → Mood als Fullscreen-Visual mit Gradient-Background
|
||||
- **Visual Card Redesign**: Mood-Cards mit kräftigeren Farben und besserer Typografie
|
||||
|
||||
---
|
||||
|
||||
## Landing: /features USP-Page
|
||||
|
||||
Neue Seite auf der Astro-Landing:
|
||||
|
||||
- **Simple/Tech Toggle**: Visitors können zwischen einer einfachen und einer technischen Beschreibung wechseln
|
||||
- **Feature-Übersicht**: Alle Module mit Kurzbeschreibung
|
||||
- **Style-Fixes**: Star-Ratings durch fließenden Text ersetzt, Flow-Links subtiler (Underline statt Pills), generische Tool-Kategorien statt Brand-Namen
|
||||
|
||||
---
|
||||
|
||||
## App-Icons + i18n
|
||||
|
||||
- **12 Module** mit neuen App-Icons
|
||||
- **Fehlende i18n-Labels** nachgetragen
|
||||
- **PillNav**: Compact Nav mit User-Menu Overlay Panel
|
||||
|
||||
---
|
||||
|
||||
## planta → plants Rename
|
||||
|
||||
Modul-Rename `planta` → `plants` über die gesamte Codebase:
|
||||
|
||||
- Routes, Imports, Collections, Branding, i18n Keys
|
||||
- Codebase-Cleanup von Resten des alten Namens
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Fixes
|
||||
|
||||
| Fix | Detail |
|
||||
| ------------- | -------------------------------------------------------- |
|
||||
| Auth Token | `getValidToken()` statt `getAccessToken()` für API-Calls |
|
||||
| Calc | Safe-Evaluate-Engine in ListView + Error-Logging |
|
||||
| Calendar A11y | Event-Rows als `<button>` für Keyboard-Navigation |
|
||||
| Light Mode | Hardcoded White Text entfernt, Theme-Tokens verwendet |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| --------------------------- | --------- |
|
||||
| Commits | 18 |
|
||||
| Files changed | 232 |
|
||||
| LOC added | ~8.415 |
|
||||
| LOC removed | ~2.447 |
|
||||
| Net | +5.968 |
|
||||
| Neue Module | 1 (Drink) |
|
||||
| Module mit FloatingInputBar | 7 |
|
||||
| App-Icon-Updates | 12 |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Shared UI-Components > per-module Kopien**: Die FloatingInputBar spart ~50 LOC pro Modul. Bei 7 Modulen sind das 350 LOC weniger zu maintainen — und jeder Fix wirkt überall.
|
||||
|
||||
2. **Local STT als Privacy-Default**: Wenn das Modell geladen ist, verlassen keine Audio-Daten das Gerät. Die Server-Fallback-Option gibt's trotzdem, aber der Default ist privacy-first.
|
||||
|
|
@ -0,0 +1,251 @@
|
|||
---
|
||||
title: 'Companion Brain: 7 Phasen in einem Tag + Sleep, Stretch, Recipes, Mail Module'
|
||||
description: 'Companion Brain komplett aufgebaut: Domain Event Bus, Projection Engine, Goal System, Tool Layer, Companion Chat mit LLM, Ritual System, Semantic Memory, Pattern Extractors, Correlation Engine, 29 Module verdrahtet, 29 Unit-Tests. Plus vier neue Module: Sleep, Stretch, Recipes, Mail.'
|
||||
date: 2026-04-13
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'companion-brain',
|
||||
'domain-events',
|
||||
'projections',
|
||||
'goals',
|
||||
'rituals',
|
||||
'semantic-memory',
|
||||
'correlation-engine',
|
||||
'llm',
|
||||
'sleep',
|
||||
'stretch',
|
||||
'recipes',
|
||||
'mail',
|
||||
'landing',
|
||||
]
|
||||
featured: true
|
||||
commits: 30
|
||||
readTime: 18
|
||||
stats:
|
||||
filesChanged: 289
|
||||
linesAdded: 27160
|
||||
linesRemoved: 1394
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 30
|
||||
workingHours:
|
||||
start: '2026-04-13T09:00'
|
||||
end: '2026-04-13T23:00'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Companion Brain** — komplettes AI-Subsystem in 7 Phasen aufgebaut: Event Bus → Projections → Goals → Tools → Chat → Rituals → Memory
|
||||
- **29 Module** verdrahtet mit Domain Events + Tools
|
||||
- **29 Unit-Tests** für Event Bus, Tools, Goals, Streaks, Correlations
|
||||
- **Companion Chat** mit LLM Tool-Calling — der Companion kann jetzt mit dem User sprechen UND handeln
|
||||
- **4 neue Module**: Sleep, Stretch, Recipes, Mail
|
||||
- **Landing /features Page** mit Simple/Tech Toggle
|
||||
|
||||
---
|
||||
|
||||
## Companion Brain — von Null auf Vollständig
|
||||
|
||||
Das Companion Brain ist das AI-Subsystem das den Companion befähigt, den Kontext des Users zu verstehen und proaktiv zu handeln. Heute in 7 Phasen von Null auf funktionsfähig gebracht.
|
||||
|
||||
### Phase 1: Domain Event Bus
|
||||
|
||||
Foundation: ein typisierter Event-Bus der Module-Events emittiert:
|
||||
|
||||
```typescript
|
||||
eventBus.emit({
|
||||
type: 'task.completed',
|
||||
module: 'todo',
|
||||
payload: { taskId, title, completedAt },
|
||||
userId,
|
||||
timestamp: Date.now(),
|
||||
});
|
||||
```
|
||||
|
||||
Fünf Pilot-Module verdrahtet: Todo, Habits, Journal, Notes, Contacts. Jedes Modul emittiert Events bei CRUD-Operationen.
|
||||
|
||||
### Phase 2: Projection Engine
|
||||
|
||||
Aus den rohen Events werden aggregierte Projektionen:
|
||||
|
||||
- **DaySnapshot**: Tagesübersicht über alle Module — Aufgaben erledigt, Habits geloggt, Stimmung, Notizen geschrieben
|
||||
- **Streaks**: Automatische Streak-Erkennung über konsistente Aktionen (z.B. "7 Tage in Folge meditiert")
|
||||
- **Context Document**: Natürlichsprachliches Dokument das den aktuellen Zustand des Users beschreibt — Input für den Companion Chat
|
||||
|
||||
DaySnapshot-Berechnung parallelisiert für bessere Performance. `_activity` Table als veraltet markiert (ersetzt durch Event-basierte Projektionen).
|
||||
|
||||
### Phase 3: Goal System + Pulse Rule Engine
|
||||
|
||||
- **Goal Editor UI**: Ziele erstellen mit Titel, Beschreibung, Metrik, Deadline
|
||||
- **Event-driven Incremental Streaks**: Streaks werden inkrementell bei jedem Event aktualisiert statt täglich komplett neu berechnet
|
||||
- **Pulse Rule Engine**: Regelbasiertes System das auf DaySnapshot-Patterns reagiert
|
||||
- **Feedback Loop**: Pulse-Ergebnisse fließen in den Context Document zurück
|
||||
|
||||
### Phase 4: Tool Layer
|
||||
|
||||
Der Companion bekommt LLM-accessible Tools:
|
||||
|
||||
```typescript
|
||||
const tools = [
|
||||
{ name: 'list_tasks', handler: () => tasksStore.getAll() },
|
||||
{ name: 'complete_task', handler: ({ id }) => tasksStore.complete(id) },
|
||||
{ name: 'create_note', handler: ({ title, content }) => notesStore.create({ title, content }) },
|
||||
// ...
|
||||
];
|
||||
```
|
||||
|
||||
Tools sind nach Modulen organisiert. Jedes Tool hat einen JSON-Schema für die LLM-Parameter-Validierung.
|
||||
|
||||
### Phase 5: Companion Chat mit LLM Tool-Calling
|
||||
|
||||
Der Companion kann jetzt mit dem User chatten UND dabei Tools aufrufen:
|
||||
|
||||
- **LLM-Integration**: Chat-Completions über mana-llm mit Tool-Calling
|
||||
- **Markdown-Rendering**: Companion-Antworten werden als Markdown gerendert
|
||||
- **Loading-Status + Streaming-Feedback**: Typing-Indicator während der LLM-Antwort
|
||||
- **Multi-Turn Tool Results**: Companion kann auf vorherige Tool-Ergebnisse zugreifen (Fix: `51c8a528`)
|
||||
- **Anti-Hallucination**: Companion listet jetzt wirklich Tasks auf statt sie zu halluzinieren (Fix: `77d455a1`)
|
||||
|
||||
### Phase 6: Ritual System
|
||||
|
||||
Geführte Routinen mit Schritt-für-Schritt-Ausführung:
|
||||
|
||||
- **Morning Routine**: Aufstehen → Wasser trinken → Stretchen → Tagesplanung
|
||||
- **Evening Routine**: Journaling → Mood-Check → Morgen-Vorbereitung
|
||||
- **Custom Rituals**: Users können eigene Routinen erstellen
|
||||
- **Step Execution**: Jeder Schritt kann eine Aktion triggern (Timer starten, Habit loggen, ...)
|
||||
|
||||
### Phase 7: Semantic Memory + Pattern Extractors + Correlation Engine
|
||||
|
||||
Die intelligenteste Schicht:
|
||||
|
||||
- **Semantic Memory**: Langzeitgedächtnis des Companions. Extrahiert Facts aus Interaktionen und Events
|
||||
- **Pattern Extractors**: Erkennt wiederkehrende Muster (z.B. "User ist montags produktiver", "Kaffee korreliert mit besserer Stimmung")
|
||||
- **Correlation Engine**: Korreliert Cross-Module-Daten statistisch (Sleep-Qualität × Produktivität, Meditation × Mood, ...)
|
||||
|
||||
### Domain Events + Tools: 29 Module verdrahtet
|
||||
|
||||
In vier Commits wurden alle restlichen Module verdrahtet:
|
||||
|
||||
| Commit | Module |
|
||||
| ---------- | --------------------------------------- |
|
||||
| `c51382a7` | Habits, Journal, Notes, Contacts, Body |
|
||||
| `7752ba9f` | Finance, Dreams, Cards, Times, Events |
|
||||
| `c7de8628` | Music, Storage, Chat, Memoro, Skilltree |
|
||||
| `c95aaa4d` | Remaining 9 Module |
|
||||
|
||||
### Workbench Pages
|
||||
|
||||
4 neue Companion-Brain-Pages im Workbench:
|
||||
|
||||
- Brain Overview (DaySnapshot + Streaks)
|
||||
- Goals
|
||||
- Rituals
|
||||
- Memory Explorer
|
||||
|
||||
### Tests + Docs
|
||||
|
||||
- **29 Unit-Tests**: Event Bus emit/subscribe, Tool execution, Goal increments, Streak calculation, Correlation math
|
||||
- **Companion-Page Fix**: Schema-Version + Query-Robustness (Page renderte nicht wegen eines Dexie-Schema-Mismatch)
|
||||
- **Architecture-Docs**: Phase 5-7 Completion + Testing Guide
|
||||
- **Comprehensive Status Update**: 29 Module, TODOs, Architecture Review
|
||||
|
||||
### AI Tier + Observability
|
||||
|
||||
- **AI Tier Selector**: In der Companion Chat Toolbar kann der User den AI-Tier wählen
|
||||
- **Observability**: Chat + Tool Events werden für Monitoring emittiert
|
||||
- **NudgeToast**: Proaktive Hinweise des Companions als Toast-Notification
|
||||
- **Server LLM Fallback**: Wenn lokales LLM nicht verfügbar → Fallback auf Server-LLM
|
||||
- **Trigger-Event Bridge**: Domain Events können NudgeToasts triggern
|
||||
|
||||
### Brain → LlmOrchestrator Migration
|
||||
|
||||
Der Companion-Engine wurde auf den **LlmOrchestrator** (4-Tier-System: Browser → Server → Cloud → BYOK) migriert. Damit nutzt der Companion das gleiche Tier-System wie alle anderen AI-Features.
|
||||
|
||||
---
|
||||
|
||||
## Vier neue Module
|
||||
|
||||
### Sleep-Modul
|
||||
|
||||
Schlaf-Tracking mit drei Kernfeatures:
|
||||
|
||||
- **Sleep-Tracking**: Schlafzeiten, Schlafqualität (1-5), Aufwach-Events
|
||||
- **Hygiene-Checklists**: Vor-Schlaf-Routine (Bildschirm aus, Temperatur, ...)
|
||||
- **Stats**: Durchschnittliche Schlafdauer, Qualitäts-Trend, Best/Worst-Nächte
|
||||
|
||||
### Stretch-Modul
|
||||
|
||||
Dehn-Übungen mit geführten Routinen:
|
||||
|
||||
- **Guided Routines**: Vordefinierte Routinen (Morgen-Stretch, Nach-Sitzen, Post-Workout)
|
||||
- **Assessment**: Flexibilitäts-Assessment pro Körperregion
|
||||
- **Reminders**: Erinnerungen nach X Stunden Sitzen (via TimeBlocks-Integration)
|
||||
|
||||
### Recipes-Modul
|
||||
|
||||
Rezepte-Sammlung mit Local-First-Data:
|
||||
|
||||
- **Encryption**: Rezepte verschlüsselt gespeichert
|
||||
- **Card UI**: Rezepte als Cards mit Bild, Zutaten, Anleitung
|
||||
- **Tagging**: Kategorisierung via Tags (vegetarisch, schnell, Dessert, ...)
|
||||
|
||||
### Mail-Modul (Phase 1 MVP)
|
||||
|
||||
mana-mail Service + Frontend:
|
||||
|
||||
- **mana-mail Service**: Hono/Bun auf Port 3042, eigenes DB-Schema
|
||||
- **Frontend**: Basic Inbox-UI mit Message-List
|
||||
- **Infra**: Port-Assignment, pnpm install, DB-Schema-Setup
|
||||
- **TODO-Checklist**: Phase 1-4 Remaining Work dokumentiert
|
||||
|
||||
---
|
||||
|
||||
## Landing: /features Page
|
||||
|
||||
Neue Feature-Übersichtsseite auf der Astro-Landing:
|
||||
|
||||
- **Simple/Tech Toggle**: Besucher wählen zwischen einfacher und technischer Erklärung
|
||||
- **Style-Refinements**:
|
||||
- Star-Ratings → fließender Text-Summary
|
||||
- Flow-Links → Underline statt Pills (subtiler)
|
||||
- Generic Tool-Categories statt Brand-Namen
|
||||
|
||||
---
|
||||
|
||||
## Workbench-Verbesserungen
|
||||
|
||||
- **Fullscreen**: Verbesserter Fullscreen-Modus
|
||||
- **Scene Bar Styling**: Konsistentere Farben
|
||||
- **Inline Scene Creation**: Neue Szenen direkt im Workbench erstellen
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| ------------------------ | --------------------------------- |
|
||||
| Commits | 30 |
|
||||
| Files changed | 289 |
|
||||
| LOC added | ~27.160 |
|
||||
| LOC removed | ~1.394 |
|
||||
| Net | +25.766 |
|
||||
| Neue Module | 4 (Sleep, Stretch, Recipes, Mail) |
|
||||
| Companion Brain Phasen | 7 |
|
||||
| Module mit Domain Events | 29 |
|
||||
| Unit-Tests | 29 |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Event-Driven > Polling**: Der Domain Event Bus macht den Companion reaktiv statt periodisch. Events fließen in Echtzeit in Projektionen → der Companion hat immer den aktuellen Stand.
|
||||
|
||||
2. **Incremental Streaks > Full Recompute**: Streaks bei jedem Event inkrementell zu aktualisieren ist O(1) statt O(n). Bei 365 Tagen Journal-Einträgen macht das einen echten Unterschied.
|
||||
|
||||
3. **LLM Tool-Calling braucht Anti-Hallucination**: Der Companion halluzinierte anfangs Task-Listen statt die `list_tasks`-Tool zu benutzen. Explizite Tool-Routing + Validation-Layer waren nötig.
|
||||
|
||||
4. **Correlation ≠ Causation — aber der User soll es sehen**: Die Correlation Engine zeigt Korrelationen, nicht Kausalitäten. Das ist explizit so designed — der User interpretiert, der Companion präsentiert.
|
||||
|
|
@ -0,0 +1,338 @@
|
|||
---
|
||||
title: 'AI Workbench: Actor-Attribution, Missions, Key-Grants + Server-Side mana-ai Deployment'
|
||||
description: 'Größter AI-Tag: Actor-Attribution auf allen Records + Events + Sync, Mission-System (Planner + Runner + Input-Picker + Proposals), Key-Grant-System für verschlüsselte Server-Side-Runs, mana-ai Service deployed, Quiz-Modul, Multi-Agent-Vorbereitung (Phase 1-3), Workbench-Redesign mit Scene-Header + PageCarousel.'
|
||||
date: 2026-04-14
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'ai-workbench',
|
||||
'actor-attribution',
|
||||
'missions',
|
||||
'key-grants',
|
||||
'mana-ai',
|
||||
'proposals',
|
||||
'planner',
|
||||
'runner',
|
||||
'quiz',
|
||||
'multi-agent',
|
||||
'workbench',
|
||||
'scene-header',
|
||||
]
|
||||
featured: true
|
||||
commits: 65
|
||||
readTime: 22
|
||||
stats:
|
||||
filesChanged: 732
|
||||
linesAdded: 22522
|
||||
linesRemoved: 3997
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 65
|
||||
workingHours:
|
||||
start: '2026-04-14T08:00'
|
||||
end: '2026-04-14T23:59'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Actor-Attribution** auf allen Records, PendingChanges und DomainEvents — jeder Schreibvorgang ist einem Actor (user/ai/system) zugeordnet
|
||||
- **Mission-System** komplett: Planner → Runner → Proposals → Input-Picker → Workbench-Timeline
|
||||
- **Key-Grant-System** für verschlüsselte Server-Side-Runs — scoped Decryption für mana-ai
|
||||
- **mana-ai Service** deployed auf mana-ai.mana.how mit Prometheus-Metrics
|
||||
- **Quiz-Modul** — Quizzes erstellen und spielen
|
||||
- **Multi-Agent Vorbereitung** — Phase 1-3: Actor-Refactor, Agent CRUD, Server-Side Agent-Awareness
|
||||
- **Workbench-Redesign** — Scene-Header, PageCarousel, Inline-Edit, Width-Picker
|
||||
|
||||
---
|
||||
|
||||
## Actor-Attribution — Wer hat was geschrieben?
|
||||
|
||||
Das Fundament für das AI Workbench: **jeder Schreibvorgang** in der App wird einem Actor zugeordnet.
|
||||
|
||||
### Actor-Typen
|
||||
|
||||
```typescript
|
||||
type Actor = {
|
||||
kind: 'user' | 'ai' | 'system';
|
||||
principalId: string; // userId | agentId | 'system:streak-tracker'
|
||||
displayName: string; // gecached beim Schreiben
|
||||
};
|
||||
```
|
||||
|
||||
### Dexie-Hooks (Phase 1)
|
||||
|
||||
Die `database.ts` Hooks stempeln jetzt bei jedem Write:
|
||||
|
||||
- `__lastActor` — der Actor des letzten Schreibvorgangs
|
||||
- `__fieldActors` — per-field Actor-Tracking (welcher Actor hat welches Feld zuletzt geändert)
|
||||
|
||||
### DomainEvents (Phase 1)
|
||||
|
||||
Jedes DomainEvent trägt jetzt den emittierenden Actor. Damit kann der Workbench-Timeline filtern: "Zeige nur AI-Änderungen" oder "Zeige nur meine Änderungen".
|
||||
|
||||
### Sync-Integration (Phase 1 → mana-sync)
|
||||
|
||||
Drei Commits für Sync-Actor-Support:
|
||||
|
||||
1. **mana-sync**: `actor` JSON-Feld auf jeder `sync_changes` Row persistiert
|
||||
2. **Webapp Sync Client**: Actor wird durch den gesamten Sync-Pfad gethread
|
||||
3. **Incoming Server Changes**: `__lastActor` + `__fieldActors` auf eingehende Server-Änderungen gestempelt
|
||||
|
||||
### System-Actor
|
||||
|
||||
Projections (z.B. Streak-Tracker) wrappen ihre Writes in einen `system:streak-tracker` Actor. Damit unterscheidet der Workbench-Timeline zwischen echten AI-Aktionen und System-Automatismen.
|
||||
|
||||
---
|
||||
|
||||
## Mission-System — von Planner bis Workbench
|
||||
|
||||
Missions sind langlebige autonome Arbeitsaufträge für den AI-Companion. Heute das komplette System aufgebaut.
|
||||
|
||||
### Schritt 1: Mission Datamodel
|
||||
|
||||
```typescript
|
||||
interface Mission {
|
||||
id: string;
|
||||
title: string;
|
||||
objective: string; // Was soll der Companion tun?
|
||||
inputs: MissionInput[]; // Verknüpfte Daten (Notes, Goals, ...)
|
||||
cadence: 'once' | 'daily' | 'weekly';
|
||||
status: 'active' | 'paused' | 'completed';
|
||||
iterations: Iteration[]; // Jede Ausführung
|
||||
}
|
||||
```
|
||||
|
||||
### Schritt 2: Mission Planner (LLM)
|
||||
|
||||
Der Planner analysiert das Objective + die Inputs und erzeugt einen Plan:
|
||||
|
||||
- Prompt-Template mit Context-Document, Input-Zusammenfassungen, verfügbaren Tools
|
||||
- Parser für strukturierte LLM-Outputs
|
||||
- Extrahiert nach `@mana/shared-ai` für Server-Side Reuse
|
||||
|
||||
### Schritt 3: MissionRunner
|
||||
|
||||
Orchestriert Planner + Tool-Execution + Proposal-Staging:
|
||||
|
||||
```
|
||||
Mission.objective + inputs
|
||||
↓ Planner (LLM)
|
||||
Plan: [{ tool: 'create_task', params: { title: '...' } }, ...]
|
||||
↓ Policy Check
|
||||
↓ auto → execute silent
|
||||
↓ propose → create Proposal card
|
||||
↓
|
||||
Iteration { status, plan, results, proposals }
|
||||
```
|
||||
|
||||
- Production Wiring mit Default-Input-Resolvers (Notes, Goals, Kontext)
|
||||
- Live Phase + Elapsed + Cancel für laufende Iterationen
|
||||
|
||||
### Schritt 4: Policy-Gated Tool Executor
|
||||
|
||||
Jedes Tool hat eine Policy: `auto` (silent ausführen) oder `propose` (User muss approven):
|
||||
|
||||
- `auto`: Read-only Tools wie `list_tasks`, `get_task_stats`
|
||||
- `propose`: Write-Tools wie `create_task`, `complete_task`
|
||||
|
||||
PendingProposals-Lifecycle mit Status-Tracking.
|
||||
|
||||
### Schritt 5: Inline Proposal Inbox
|
||||
|
||||
`<AiProposalInbox module="todo" />` in der Todo-Seite zeigt pending Proposals inline:
|
||||
|
||||
- Approve-Button → Tool wird ausgeführt
|
||||
- Reject-Button → Proposal wird verworfen
|
||||
|
||||
### Schritt 6: Missions UI + Input Picker
|
||||
|
||||
- Missions-Liste unter `/companion/missions`
|
||||
- **Input-Picker**: Notes, Kontext-Dokument und Goals als Mission-Inputs verlinken
|
||||
- Resolver/Indexer-Symmetrie dokumentiert
|
||||
|
||||
### Schritt 7: Workbench Timeline
|
||||
|
||||
Cross-Module AI-Activity-Lens auf `/ai-workbench`:
|
||||
|
||||
- Gruppiert nach Mission-Iteration
|
||||
- Per-Module-Filter
|
||||
- Actor-Filter (nur AI / nur User / alle)
|
||||
|
||||
### Revert-per-Iteration
|
||||
|
||||
Button pro Iteration: "Diese AI-Änderungen rückgängig machen":
|
||||
|
||||
- TaskCreated → Delete
|
||||
- TaskCompleted → Uncomplete
|
||||
- Newest-first Reihenfolge
|
||||
|
||||
---
|
||||
|
||||
## Key-Grant-System — Verschlüsselte Server-Side-Runs
|
||||
|
||||
Das größte Sicherheits-Feature des Tages. Problem: mana-ai läuft server-side und braucht Zugriff auf verschlüsselte User-Daten für Missions. Aber der Master-Key darf nicht permanent beim Server liegen.
|
||||
|
||||
### Lösung: Mission Key-Grants
|
||||
|
||||
1. **Contract** in `@mana/shared-ai`: Definiert das Grant-Format (scoped, zeitlich begrenzt, auditiert)
|
||||
2. **mana-auth Endpoint**: `POST /api/v1/vault/grant` — erzeugt einen scoped Key-Grant für eine spezifische Mission
|
||||
3. **Consent UI**: User muss explizit bestätigen: "Ich erlaube dem Companion, für diese Mission meine Daten zu lesen"
|
||||
4. **Audit Tab**: Workbench zeigt alle Key-Grants mit Zeitstempel, Scope und Status
|
||||
5. **mana-ai Resolver**: Encrypted Resolver nutzt den Key-Grant um Inputs zu decrypten — nur die Inputs die die Mission braucht
|
||||
6. **Rollout-Gating**: Feature-Flag `PUBLIC_AI_MISSION_GRANTS`, Alerts bei Grant-Nutzung, Runbook, User-Docs
|
||||
|
||||
### Svelte $state Proxy Bug
|
||||
|
||||
Zwei Debug-Fixes:
|
||||
|
||||
- `structuredClone` → JSON-roundtrip `deepClone`: Svelte $state Proxies sind nicht structuredClone-able
|
||||
- Proxies vor Dexie-Writes strippen (Dexie kann keine Proxies speichern)
|
||||
|
||||
---
|
||||
|
||||
## mana-ai Service — Server-Side Mission Runner
|
||||
|
||||
Neuer Service `mana-ai` (Port 3067):
|
||||
|
||||
### v0.1: Scaffold
|
||||
|
||||
- Hono/Bun-Service mit Auth-Middleware
|
||||
- Tick-Loop: Periodisch active Missions abfragen und Iterations ausführen
|
||||
- Dockerfile + Docker-Compose-Wiring
|
||||
|
||||
### v0.2: Real LLM Calls
|
||||
|
||||
- Shared-AI Planner + Parser integriert
|
||||
- Echte mana-llm API-Calls statt Mocks
|
||||
- Write-Back: Server-Iterations werden via Sync an den Client gepusht
|
||||
|
||||
### Deploy
|
||||
|
||||
- `mana-ai.mana.how` via Cloudflare Tunnel
|
||||
- Prometheus `/metrics` Endpoint
|
||||
- status.mana.how Integration
|
||||
- Materialized Mission-Snapshots (Performance: kein Full-Replay pro Tick)
|
||||
- RLS-scoped Mission-Reads (User sieht nur eigene Missions)
|
||||
|
||||
### Infrastructure
|
||||
|
||||
- Port-Clash mit news-ingester (3066 → 3067) behoben
|
||||
- shared-logger + shared-ai in Dockerfiles
|
||||
- mana-crawler in den Dev-Stack verdrahtet
|
||||
- Dev-User-Setup: Credit-Balance + Admin-Role
|
||||
|
||||
---
|
||||
|
||||
## Quiz-Modul
|
||||
|
||||
Neues Modul zum Erstellen und Spielen von Quizzes:
|
||||
|
||||
- **Quiz-Builder**: Fragen + Antworten + Erklärungen erstellen
|
||||
- **Play-Mode**: Multiple-Choice mit Score-Tracking
|
||||
- **Edit**: Bestehende Fragen bearbeiten
|
||||
- **Guest Seed**: Demo-Quiz für unangemeldete Besucher
|
||||
|
||||
---
|
||||
|
||||
## Multi-Agent Vorbereitung (Phase 1-3)
|
||||
|
||||
Drei Phasen für das Multi-Agent-System:
|
||||
|
||||
### Phase 1: Identity-Aware Actor
|
||||
|
||||
Actor-Refactor: Agents sind jetzt first-class Actors mit eigener Identity:
|
||||
|
||||
```typescript
|
||||
{ kind: 'ai', principalId: 'agent_abc123', displayName: 'Recherche-Agent' }
|
||||
```
|
||||
|
||||
### Phase 2: Agent CRUD + Default Bootstrap
|
||||
|
||||
- Agent-CRUD-UI unter `/ai-agents`
|
||||
- Default "Mana" Agent wird beim ersten Login auto-bootstrapped
|
||||
- `Mission.agentId` — jede Mission gehört einem Agent
|
||||
|
||||
### Phase 3: Server-Side Agent-Awareness
|
||||
|
||||
mana-ai Tick-Loop ist jetzt agent-aware:
|
||||
|
||||
- Snapshot-Projection pro Agent
|
||||
- Agent-spezifische Mission-Queries
|
||||
|
||||
---
|
||||
|
||||
## Workbench-Redesign
|
||||
|
||||
### Scene-Header
|
||||
|
||||
- Scene-Description-Feld (statt nur Titel)
|
||||
- Scene-Icon entfernt (überflüssig)
|
||||
- Inline-Edit direkt im Header (kein Modal)
|
||||
- Leading Snippet vor der ersten Page (optionaler Content-Bereich)
|
||||
|
||||
### PageCarousel
|
||||
|
||||
Jede AI-Feature ist jetzt eine eigene Page im Carousel:
|
||||
|
||||
- Empty-State Message wenn Scene keine Apps hat
|
||||
- Five-Preset Width-Picker statt Drag-Handle
|
||||
- Auto-Scroll beim Scene-Wechsel
|
||||
- Inline Rename statt Modal
|
||||
|
||||
### Companion Refactor
|
||||
|
||||
Der Companion wird in ein PageCarousel refactored — jedes AI-Feature (Chat, Missions, Brain, ...) ist eine eigene Seite statt verschachtelte Sub-Routes.
|
||||
|
||||
---
|
||||
|
||||
## Kontext-Modul Erweiterungen
|
||||
|
||||
- **URL Import**: `POST /api/v1/context/import-url` — Crawler + optionale LLM-Summary
|
||||
- **appendContent**: Inhalte an das Kontext-Dokument anhängen
|
||||
- **Cross-Module Handoff**: Kontext als Note speichern (Notes-Integration)
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Fixes + Features
|
||||
|
||||
| Bereich | Was |
|
||||
| ------------------ | ------------------------------------------------------------------------- |
|
||||
| zitare → quotes | Rename über die Codebase |
|
||||
| shared-types | `.ts` Extensions + `.js` re-exports für NodeNext-Kompatibilität |
|
||||
| pako | Missing dep für Backup-Import |
|
||||
| a11y | Pre-push svelte-check Warnings gefixt |
|
||||
| web-research | Failures an den Planner surfacen statt halluzinieren |
|
||||
| Pill Nav | Cloud-Sync Pill ins User-Menu verschoben |
|
||||
| CommandBar | Zu GlobalSpotlight migriert, CommandBar gelöscht |
|
||||
| Keyboard Shortcuts | Workbench + Nav Bars Shortcuts |
|
||||
| Proposal Inbox | Ausgerollt auf Calendar, Places, Drink, Food |
|
||||
| Proposal Reject | Freitext-Feedback bei Rejection → fließt in die nächste Mission-Iteration |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| ------------------ | ----------------------------- |
|
||||
| Commits | 65 |
|
||||
| Files changed | 732 |
|
||||
| LOC added | ~22.520 |
|
||||
| LOC removed | ~3.997 |
|
||||
| Net | +18.525 |
|
||||
| Neue Module | 1 (Quiz) |
|
||||
| AI-System Schritte | 7 (Actor → Missions → Grants) |
|
||||
| mana-ai Versionen | v0.1 → v0.2 → deployed |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Actor-Attribution ist das Fundament für AI-Transparency**: Ohne zu wissen wer was geschrieben hat, ist AI-Output nicht von User-Input unterscheidbar. Das muss auf der tiefsten Ebene (Dexie-Hooks) sitzen, nicht als Afterthought.
|
||||
|
||||
2. **Key-Grants > permanenter Server-Key**: Der Server bekommt nur temporären, scoped Zugriff auf die Daten die eine Mission braucht. Das ist mehr Aufwand als einen permanenten Key zu deployen, aber die richtige Architektur für ein verschlüsseltes System.
|
||||
|
||||
3. **Svelte $state Proxies sind nicht structuredClone-able**: Subtiler Bug — `structuredClone(proxy)` wirft keinen Error, erzeugt aber ein leeres Objekt. JSON-roundtrip ist der sichere Weg.
|
||||
|
||||
4. **Feature-Flags für Security-Features**: Key-Grants hinter einem Flag zu deployen erlaubt gradual Rollout mit Alerting — besser als big-bang Activation.
|
||||
|
|
@ -0,0 +1,372 @@
|
|||
---
|
||||
title: 'Multi-Agent Workbench, News-Research, BYOK, Theme-Migration + Settings-Consolidation'
|
||||
description: 'Multi-Agent Phase 4-7: Policy pro Agent, Agents UI + Scene-Binding, Workbench Agent-Filter, Tag-basiertes Scoping. News-Research mit RSS-Discovery. BYOK mit 4 Provider-Adaptern. Theme-Token-Migration auf --color-*. Settings in Workbench konsolidiert. Reasoning Loop. 35 BYOK-Tests.'
|
||||
date: 2026-04-15
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'multi-agent',
|
||||
'ai-agents',
|
||||
'policy',
|
||||
'scene-binding',
|
||||
'news-research',
|
||||
'rss',
|
||||
'byok',
|
||||
'theme',
|
||||
'settings',
|
||||
'reasoning-loop',
|
||||
'templates',
|
||||
'mcp',
|
||||
'tailwind',
|
||||
]
|
||||
featured: true
|
||||
commits: 96
|
||||
readTime: 22
|
||||
stats:
|
||||
filesChanged: 519
|
||||
linesAdded: 24384
|
||||
linesRemoved: 9576
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 96
|
||||
workingHours:
|
||||
start: '2026-04-15T08:00'
|
||||
end: '2026-04-15T23:59'
|
||||
---
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Multi-Agent Phase 4-7** — Policy pro Agent, Agents UI + Scene-Binding, Workbench Agent-Filter, Tag-basiertes Scoping
|
||||
- **News-Research** — RSS-Feed-Discovery, Filter und AI-Context-Export als shared-rss Package
|
||||
- **BYOK** — Bring Your Own Key mit 4 Provider-Adaptern (OpenAI, Anthropic, Gemini, Mistral) + IndexedDB Vault + 35 Tests
|
||||
- **Theme-Token-Migration** — alle bare shadcn Tokens → `--color-*` Namenskonvention
|
||||
- **Settings-Consolidation** — Sync, My-Data, Vault inline statt Sub-Routes
|
||||
- **Reasoning Loop** — Agent chains auto-Tools vor Approval
|
||||
- **Templates** — WorkbenchTemplate-System + 3 Agent- + 2 Workbench-Templates
|
||||
- **MCP Server** — 27/29 Tool-Handlers implementiert
|
||||
- **Dynamic Tool Registry** — Single-Source-Catalog in shared-ai
|
||||
|
||||
---
|
||||
|
||||
## Multi-Agent Workbench — Phase 4-7
|
||||
|
||||
Das Multi-Agent-System wird in vier Phasen fertiggestellt.
|
||||
|
||||
### Phase 4: Policy pro Agent
|
||||
|
||||
Jeder Agent hat seine eigene Policy — welche Tools darf er auto-ausführen, welche brauchen Approval:
|
||||
|
||||
```typescript
|
||||
agent.policy = {
|
||||
create_task: 'auto',
|
||||
complete_task: 'propose',
|
||||
create_note: 'auto',
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
Die Policy wird beim MissionRunner-Start geladen und pro Tool-Aufruf gecheckt.
|
||||
|
||||
### Phase 5: Agents UI + Scene-Binding
|
||||
|
||||
- **Agent-CRUD** unter `/ai-agents`: Erstellen, Bearbeiten, Löschen von Agents
|
||||
- **Scene-Binding**: Agents können an Workbench-Scenes gebunden werden (Context-Menu → "An Agent binden…"). Reiner UI-Lens, kein Data-Scoping
|
||||
- **Mission-Picker**: Missions einem Agent zuordnen
|
||||
|
||||
### Phase 6: Workbench Agent-Filter + Proposal Agent-Chip
|
||||
|
||||
- **Agent-Filter**: Workbench-Timeline filtern nach Agent
|
||||
- **Proposal Agent-Chip**: Jede Proposal-Card zeigt den verantwortlichen Agent mit Avatar
|
||||
|
||||
### Phase 7: Tag-basiertes Scoping
|
||||
|
||||
Agents sehen nur Records die zu ihren Tags passen:
|
||||
|
||||
- `filterBySceneScope` in Notes, Todo, Contacts, Calendar — filtert nach den Tags der gebundenen Scene
|
||||
- `filterByScope` in AI-Tools: `list_tasks`, `get_contacts`, `get_todays_events` — Agents sehen nur relevante Daten
|
||||
- Note-Tag-UI: Tags werden in der Note-Ansicht für AI-Scoping angezeigt
|
||||
|
||||
### Guardrail Layer
|
||||
|
||||
Pre/Post-Plan + Pre-Execute Checks:
|
||||
|
||||
- **Pre-Plan**: Validiert ob die Mission noch aktiv ist, ob der Agent berechtigt ist
|
||||
- **Post-Plan**: Validiert den Plan gegen die Policy
|
||||
- **Pre-Execute**: Letzte Checks vor der Tool-Ausführung
|
||||
|
||||
### Token Budget Enforcement
|
||||
|
||||
Server-seitige Token-Budget-Limits pro Agent. Agents können nicht unbegrenzt LLM-Tokens verbrauchen.
|
||||
|
||||
---
|
||||
|
||||
## News-Research — RSS-Discovery + AI-Context-Export
|
||||
|
||||
### shared-rss Package
|
||||
|
||||
RSS-Parsing + Readability in ein eigenes Package `@mana/shared-rss` extrahiert:
|
||||
|
||||
- Feed-Discovery via URL
|
||||
- Article-Extraction via Readability
|
||||
- Standardisiertes Feed-Format
|
||||
|
||||
### News-Research Modul
|
||||
|
||||
RSS-Feed-Discovery, Filter und AI-Context-Export:
|
||||
|
||||
- **`discoverByQuery`**: Sucht RSS-Feeds zu einem Thema
|
||||
- **`searchFeeds`**: Durchsucht bekannte Feeds nach Keywords
|
||||
- **AI-Context-Export**: Gefundene Artikel als strukturierten Context für den Companion aufbereiten
|
||||
|
||||
### Integration mit Missions
|
||||
|
||||
Missions deren Objective Research-Keywords enthält (`recherchier|research|news|...`) bekommen automatisch eine Web-Research-Pre-Step:
|
||||
|
||||
- RSS-Discovery + Feed-Search vor dem Planner-Call
|
||||
- Ergebnisse als `save_news_article` Instruktionen injiziert
|
||||
- Fix: Deep-Research → News-Research RSS geswitcht (stabiler)
|
||||
- Fix: Web-Research Failures an den Planner surfacen statt halluzinieren
|
||||
|
||||
### Dev-Stack
|
||||
|
||||
SearXNG + mana-search in `dev:mana:all` verdrahtet.
|
||||
|
||||
---
|
||||
|
||||
## BYOK — Bring Your Own Key
|
||||
|
||||
Users können ihre eigenen API-Keys für AI-Provider hinterlegen:
|
||||
|
||||
### LLM-Tier-System
|
||||
|
||||
Neuer `byok` Tier neben `browser`, `server`, `cloud`:
|
||||
|
||||
```
|
||||
browser (local Gemma/Whisper, WebGPU)
|
||||
→ server (Ollama auf GPU-Box, self-hosted)
|
||||
→ cloud (Gemini API, managed)
|
||||
→ byok (User's own API keys)
|
||||
```
|
||||
|
||||
### 4 Provider-Adapter
|
||||
|
||||
| Provider | Model |
|
||||
| ------------- | -------------------- |
|
||||
| OpenAI | GPT-4o, GPT-4o-mini |
|
||||
| Anthropic | Claude Sonnet, Opus |
|
||||
| Google Gemini | Gemini 2.5 Flash/Pro |
|
||||
| Mistral | Mistral Large |
|
||||
|
||||
### IndexedDB Vault
|
||||
|
||||
API-Keys werden **verschlüsselt in IndexedDB** gespeichert:
|
||||
|
||||
- Eigener BYOK-Vault (nicht im Haupt-Vault)
|
||||
- Keys verlassen nie den Browser (Client-Side API-Calls)
|
||||
- Settings-UI unter dem AI-Tier-Card
|
||||
|
||||
### Per-Task Tier Override
|
||||
|
||||
Einzelne AI-Tasks können den globalen Tier überschreiben — z.B. "für diese Mission nutze Claude Opus statt lokales Gemma".
|
||||
|
||||
### Tests
|
||||
|
||||
35 Unit-Tests für:
|
||||
|
||||
- Vault encrypt/decrypt Lifecycle
|
||||
- Provider-Adapter API-Shape
|
||||
- Tier-Override-Resolution
|
||||
- Key-Rotation
|
||||
|
||||
---
|
||||
|
||||
## Theme-Token-Migration
|
||||
|
||||
Große Migration aller CSS-Tokens:
|
||||
|
||||
### Problem
|
||||
|
||||
Bare shadcn Tokens (`--muted`, `--primary`, `--border`, ...) waren überall im Code verstreut. Das macht Theme-Wechsel fragil und Dark-Mode-Support inkonsistent.
|
||||
|
||||
### Lösung
|
||||
|
||||
Drei Commits migrieren alles auf `--color-*` Namenskonvention:
|
||||
|
||||
1. **Shared Packages** → `--color-muted`, `--color-primary`, ...
|
||||
2. **Remaining bare Tokens** → vollständige Migration
|
||||
3. **Alias-Layer**: `--muted` → `--color-muted` Aliases für Übergangszeit
|
||||
|
||||
### Tailwind Fix
|
||||
|
||||
`@source` Paths in der Tailwind-Config waren falsch — Tailwind scannte keine shared Packages. Fix: korrekte Pfade in `@mana/shared-tailwind/sources.css` zentralisiert.
|
||||
|
||||
### Lint Guard
|
||||
|
||||
Neuer `audit:theme-tokens` Guard verhindert Rückfall auf bare `--muted` / `--theme-*` Tokens.
|
||||
|
||||
---
|
||||
|
||||
## Settings-Consolidation
|
||||
|
||||
Die Settings-Page wird radikal vereinfacht:
|
||||
|
||||
### Inline statt Sub-Routes
|
||||
|
||||
Sync, My-Data und Vault-Settings werden **inline** in den Settings gerendert statt als eigene Sub-Routes:
|
||||
|
||||
- Weniger Navigation
|
||||
- Alles auf einen Blick
|
||||
- Sub-Routes gelöscht
|
||||
|
||||
### Workbench-Migration
|
||||
|
||||
Fünf Bereiche werden zu Workbench-Apps migriert:
|
||||
|
||||
- **Profile & Themes** → Workbench-App mit Deep-Links
|
||||
- **Spiral** → Workbench-App (standalone Route gelöscht)
|
||||
- **Help** → Workbench-App (standalone Route gelöscht)
|
||||
- **Subscription** → merged in "Credits & Abo"
|
||||
- **Credits** → merged mit Subscription zu einem App
|
||||
|
||||
### GeneralSection
|
||||
|
||||
Settings-ListView zeigt jetzt den `GeneralSection`-Content statt ihn inline zu duplizieren. Section-Headers über alle Tabs vereinheitlicht.
|
||||
|
||||
### BYOK Key Manager
|
||||
|
||||
BYOK-Key-Manager inline unter der AI-Tier-Card in den Settings.
|
||||
|
||||
---
|
||||
|
||||
## Reasoning Loop
|
||||
|
||||
Der foreground MissionRunner kann jetzt **chained auto-tools** ausführen:
|
||||
|
||||
```
|
||||
Planner call 1 → list_tasks (auto) → execute → result
|
||||
↓ feed result back
|
||||
Planner call 2 → create_task (propose) → stop, create Proposal
|
||||
```
|
||||
|
||||
Bis zu 5 Planner-Calls pro Iteration. Read-only Tools (auto-policy) werden inline ausgeführt, ihre Outputs als `ResolvedInput` für den nächsten Planner-Call gefüttert. Die Loop stoppt wenn:
|
||||
|
||||
- Ein propose-policy Tool getriggert wird
|
||||
- Der Planner 0 Steps zurückgibt
|
||||
- Das Budget exhausted ist
|
||||
|
||||
`maxTokens` von 1024 → 4096 gebumpt (der Planner braucht mehr Platz für den Reasoning-Output).
|
||||
|
||||
---
|
||||
|
||||
## Templates
|
||||
|
||||
### WorkbenchTemplate System
|
||||
|
||||
Generalisiertes Template-System für Workbench-Setups:
|
||||
|
||||
```typescript
|
||||
interface WorkbenchTemplate {
|
||||
agent?: AgentTemplate;
|
||||
scenes?: SceneTemplate[];
|
||||
missions?: MissionTemplate[];
|
||||
seeds?: ModuleSeedTemplate[];
|
||||
}
|
||||
```
|
||||
|
||||
### Agent-Templates (mit AI)
|
||||
|
||||
| Template | Agent | Missions |
|
||||
| --------------- | ----------------------- | --------------------------------------- |
|
||||
| Recherche-Agent | Research-focused Policy | News-Discovery, Artikel-Zusammenfassung |
|
||||
| Kontext-Agent | Notes/Kontext-focused | Kontext-Dokument pflegen |
|
||||
| Today-Agent | Day-Planning-focused | Tagesplanung, Task-Review |
|
||||
|
||||
### Workbench-Templates (ohne AI)
|
||||
|
||||
| Template | Layout |
|
||||
| --------- | ---------------------------- |
|
||||
| Calmness | Meditation, Journal, Moodlit |
|
||||
| Fitness | Body, Stretch, Sleep |
|
||||
| Deep Work | Todo, Notes, Calendar, Timer |
|
||||
|
||||
---
|
||||
|
||||
## MCP Server — 27/29 Tool-Handlers
|
||||
|
||||
API-Endpoint für externe MCP-Clients:
|
||||
|
||||
- **Phase 1**: `/api/v1/mcp` Endpoint exposiert AI-Tools
|
||||
- **Phase 2**: Real DB-Operations für Tool-Execution (nicht nur Stubs)
|
||||
- **Phase 3**: 19 weitere Tool-Handlers implementiert (27/29 total)
|
||||
|
||||
---
|
||||
|
||||
## Dynamic Tool Registry
|
||||
|
||||
Single-Source-Catalog in `@mana/shared-ai`:
|
||||
|
||||
Vorher: Tool-Definitionen waren dupliziert zwischen Webapp, mana-ai Service und MCP-Server. Jetzt: ein Catalog, drei Consumer. Tool-Name + Parameter-Drift zwischen Catalog und Webapp gefixt.
|
||||
|
||||
---
|
||||
|
||||
## SSE Streaming für Foreground Runner
|
||||
|
||||
Mission-Iterations werden jetzt via Server-Sent Events gestreamt:
|
||||
|
||||
- Live Phase-Updates während der Iteration
|
||||
- Elapsed-Time Counter
|
||||
- Cancel-Button für laufende Iterationen
|
||||
|
||||
---
|
||||
|
||||
## Sonstige Features + Fixes
|
||||
|
||||
| Bereich | Was |
|
||||
| -------------- | ----------------------------------------------------------------------------------------------- |
|
||||
| Sync Backup | `.mana` Zip mit Manifest + SHA256 (M3), Import-Parser + Replay (M4a), /backup/export Route (M1) |
|
||||
| Sync Protocol | schemaVersion + eventId on wire (M2 hardening) |
|
||||
| Meditate | Neues Modul mit Presets, Sessions, Breathing-UI |
|
||||
| Module Renames | nutriphi → food, eventstream → activity, cycles → period |
|
||||
| Workbench Perf | Lazy-mount Carousel via IntersectionObserver, SceneAppBar Registration split |
|
||||
| Idle-Defer | Non-critical (app) Init idle-deferred + Modals lazy-loaded |
|
||||
| PWA | Manifest + SW Registration für Install-Prompt |
|
||||
| Theme Picker | Redesign mit Gradient-Cards + Beefy Mode Selector |
|
||||
| Credits | Merge Credits + Subscription in eine Workbench-App |
|
||||
| Cloud Tier | Default Model gemini-2.0-flash → gemini-2.5-flash |
|
||||
| Audit | Module Complexity Reports + Workbench Map |
|
||||
| shared-pkgs | sideEffects: false für Tree-Shaking |
|
||||
| OTel | mana-ai OpenTelemetry Tracing + Grafana Tempo |
|
||||
| Profile | Data-Model erweitert + Interview-Field-Mappings gefixt |
|
||||
| Toasts | Global ToastContainer, inline Toasts migriert, SETUP.md gelöscht |
|
||||
| Credits Toasts | Octal-Literal-Placeholders durch echte Toast-Messages ersetzt |
|
||||
|
||||
---
|
||||
|
||||
## Numbers
|
||||
|
||||
| | |
|
||||
| ------------------ | ------------------------- |
|
||||
| Commits | 96 |
|
||||
| Files changed | 519 |
|
||||
| LOC added | ~24.384 |
|
||||
| LOC removed | ~9.576 |
|
||||
| Net | +14.808 |
|
||||
| Multi-Agent Phasen | 4-7 |
|
||||
| BYOK Provider | 4 |
|
||||
| BYOK Tests | 35 |
|
||||
| MCP Tools | 27/29 |
|
||||
| Templates | 5 (3 Agent + 2 Workbench) |
|
||||
|
||||
---
|
||||
|
||||
## Lehren
|
||||
|
||||
1. **Per-Agent Policy > globale Policy**: Verschiedene Agents brauchen verschiedene Berechtigungen. Der Recherche-Agent darf Notizen auto-erstellen, der Today-Agent nicht. Globale Policies sind zu grob.
|
||||
|
||||
2. **Reasoning Loop macht Agents nützlich**: Ohne die Möglichkeit, read-tools inline auszuführen und die Ergebnisse in den nächsten Planner-Call zu füttern, waren Agents blind. "Lies alle Tasks und erstelle basierend darauf eine Zusammenfassung" braucht mindestens 2 Planner-Calls.
|
||||
|
||||
3. **Theme-Token-Migration ist ein Einmal-Aufwand**: Die Migration auf `--color-*` war aufwändig, aber der Lint-Guard verhindert Rückfälle. Jeder zukünftige Entwickler muss sich keine Gedanken mehr machen welches Token-Format er nutzt.
|
||||
|
||||
4. **BYOK-Keys gehören nicht auf den Server**: Client-Side API-Calls mit User-Keys sind der einzige Weg der dem Privacy-Versprechen gerecht wird. Der BYOK-Vault in IndexedDB ist die logische Konsequenz.
|
||||
Loading…
Add table
Add a link
Reference in a new issue