Changeset e62f65d in Klonkt for src/routes/guardian2.js


Ignore:
Timestamp:
07/25/2026 08:01:21 AM (7 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
ad6f62a
Parents:
5c373b8
Message:

Guardian 2: de zwaai (shaer:wave), warmte zonder publiceren

Een guardian kan met één tik naar een ward zwaaien: "denkt aan je". Het is een
prive direct-note met een shaer:wave-marker, spiegelbeeld van de reddingsboei
(shaer:helpRequest): nooit een feed-post, geen boosts, geen timeline. Niet-shaer
clients zien gewoon een DM; een shaer-client kan het als zacht seintje tonen. De
guardian publiceert dus niks.

Rijdt op het bestaande direct-note-pad (delivery.js), dus cross-instance en met
retry. De ward ontvangt 'm als prive-mention (marker opgeslagen in ap_mentions.wave
voor latere weergave).

Changed files:
src/services/guardianship/notes.js

  • waveProps/isWave naast de helpRequest-marker

src/services/guardianship/index.js

  • waveProps/isWave geexporteerd

src/services/guardianship/delivery.js

  • deliverDirectNote neemt een wave-vlag, stempelt ap_outbox.wave

src/services/ActivityPubService.js

  • buildReplyNote stempelt shaer:wave; inbound mention slaat wave op

src/config/database.js

  • ap_outbox.wave + ap_mentions.wave

src/routes/guardian2.js

  • POST /api/wave (alleen naar je eigen ward); wave/waved strings

src/views/pages/guardian2.ejs, src/assets/js/guardian2.js

  • Zwaai-knop op elke ward-kaart

src/services/i18n.js

  • guardian2 wave/waved (nl/en/de)

remarks: npm test 167/167; wave-api auth-gated. Ward-kant toont 'm nu als prive-
mention (de emoji draagt 'm); een wave-badge in Berichten + het DM-antwoord-draadje
zijn de volgende, kleine stap.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/guardian2.js

    r5c373b8 re62f65d  
    4040    'pending', 'active', 'retract', 'release', 'open', 'push_unavailable',
    4141    'accept', 'reject', 'complete', 'awaiting_others', 'coguard'];
    42   return Object.fromEntries(keys.map((k) => [k, i18nT(L, `guardian.${k}`)]));
     42  const s = Object.fromEntries(keys.map((k) => [k, i18nT(L, `guardian.${k}`)]));
     43  s.wave = i18nT(L, 'guardian2.wave');
     44  s.waved = i18nT(L, 'guardian2.waved');
     45  return s;
    4346}
    4447
     
    170173  } catch (e) { return res.status(502).json({ error: 'delivery', outcome: r.outcome }); }
    171174  res.json({ ok: true, outcome: r.outcome });
     175});
     176
     177// ── Wave (FEP-633c §5, shaer:wave): a gentle "thinking of you" from a
     178//    guardian to a ward. A private direct note, never a feed post. Warmth
     179//    without publishing (Robins besluit).
     180router.post('/api/wave', requireAuth, express.json({ limit: '2kb' }), async (req, res) => {
     181  const site = siteForUser(req);
     182  if (!site) return res.status(404).json({ error: 'no_site' });
     183  const wardUri = String(req.body?.ward || '').trim();
     184  // Only wave at a ward you actually guard.
     185  const isWard = Guardianship.listWards(site.slug).some((w) => w.other_uri === wardUri);
     186  if (!wardUri || !isWard) return res.status(403).json({ error: 'not_your_ward' });
     187  const text = String(req.body?.text || '').trim().slice(0, 200) || '👋 thinking of you';
     188  const r = await AP.deliverDirectNote(site, { recipients: [wardUri], text, wave: true }).catch(() => null);
     189  if (!r) return res.status(502).json({ error: 'delivery' });
     190  res.json({ ok: true, delivered: r.delivered });
    172191});
    173192
Note: See TracChangeset for help on using the changeset viewer.