feat(visibility): embed resolvers for memoro/cards/presi (M6 follow-on)

Closes the M6 loop — flipping a memo, card-deck, or presi-deck to
'public' now actually surfaces it on the owner's website embed.
Previously M6 wired the Picker but the embed pipeline didn't know
about these sources, so the flip had no visible effect.

Three new sources in EmbedSourceSchema:
- memoro.memos — voice-memo teaser. Title + intro (140 chars) +
  audio duration. Transcript, source-audio paths, and per-utterance
  speaker data stay private — those are the user's words verbatim
  with much stronger privacy weight than a curated headline.
- cards.decks — flashcard-collection teaser. Name + "N Karten".
  Card fronts/backs, difficulty, review history all private — the
  deck is a unit; the cards belong to the play experience.
- presi.decks — "talks I've given" teaser. Title + "N Folien"
  (counted by joining the slides table). Slide content stays
  private — the public deck is a pointer, the slides belong to
  the talk experience.

Each resolver tolerates the M6 soft-migration window: visibility
falls back to legacy isPublic for rows that haven't been re-saved
since the M6 commit.

Inspector dropdown updated to expose all 15 sources.

Note: 3 unrelated svelte-check errors in
data/seeds/wiring.test.ts (spaceId on LocalWorkbenchScene) from a
parallel session. Not introduced here.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-25 14:33:43 +02:00
parent e0ec7fe33f
commit f71a9377c0
3 changed files with 143 additions and 0 deletions

View file

@ -28,6 +28,9 @@
<option value="habits.habits">Habits</option>
<option value="quiz.quizzes">Quizze</option>
<option value="events.socialEvents">Events (RSVP)</option>
<option value="memoro.memos">Memoro</option>
<option value="cards.decks">Karten (Decks)</option>
<option value="presi.decks">Präsentationen</option>
</select>
</label>

View file

@ -39,6 +39,9 @@ export const EmbedSourceSchema = z.enum([
'habits.habits',
'quiz.quizzes',
'events.socialEvents',
'memoro.memos',
'cards.decks',
'presi.decks',
]);
export type EmbedSource = z.infer<typeof EmbedSourceSchema>;