Skip to content

feat: bread bot hubs with threads/in-chat split, invite auto-accept, transcript interop, and peer trust - #28

Merged
daopunk merged 19 commits into
mainfrom
feat/bam
Aug 5, 2026
Merged

feat: bread bot hubs with threads/in-chat split, invite auto-accept, transcript interop, and peer trust#28
daopunk merged 19 commits into
mainfrom
feat/bam

Conversation

@daopunk

@daopunk daopunk commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Rebrand translation hub copy to Bread Bot; slim !help vs descriptive !info / !explain, plus !help-threads / !help-in-chat / !help-transcription feature guides.
  • Split product menus into !translation-threads and !translation-in-chat (legacy !translation redirects; near-miss aliases like !translate-in-chat / !translate-thread).
  • Language Threads: !translate-me-thread, !leave, !enable-in-chat (tear down threads and apply pending in-chat enable); notify sidecars when switching to in-chat; sidecar welcome lists !help / !rename / !leave / !info; sidecar-only !commands for the compact thread command list.
  • In-chat auto: group-wide !translate-all-on / !translate-all-off, per-person !translate-me-on / !translate-me-off, and !enable-threads to clear all in-chat auto and apply a pending !translate-me-thread subscribe when switching to Language Threads.
  • Mutual exclusion between Language Threads and in-chat auto with pending-switch storage so a refused enable applies after !enable-in-chat or !enable-threads.
  • Sidecar mapping: persist both Signal send ids (group.…) and internal ids; resolve inbound sidecar traffic via index, send-id lookup, or list_groups reconcile when ids drift after product switches.
  • Hub privacy/attest: single translation-hub !privacy (covers both CVMs); !verify challenge strings labeled Translation: … / Transcription: … so paired-group dual replies are distinguishable.
  • Transcription worker: post Voice Transcription menu on !transcription invite; default auto-transcribe off; !transcribe refuses when auto is already on.
  • Auto-accept group invites by role: translation accepts all pending invites; transcription accepts only when the translation peer is already in the group (requires PEER_PHONE).
  • Transcript ↔ in-chat interop: with !translate-all-on (or personal auto for the speaker), the translation bot translates transcription-bot 📝 Transcript: posts — does not skip when voice attachment metadata is present; strips the transcript label before detect/translate (same as manual !translate).
  • Peer identity trust: on startup, trust PEER_PHONE via signal-cli (trust_all_known_keys) so paired bots can decrypt each other's group messages after re-registration (fixes silent miss of transcripts when the peer was UNTRUSTED).
  • Signal client: group id resolution/cache helpers plus identity trust helpers for consistent send vs internal id handling.
  • Docs: translation hub vs transcription worker hierarchy; in-chat / language-threads / voice guides; local-dev peer-trust notes.

Test plan

  • !help / !info / !explain on translation bot — Bread Bot hub, threads vs in-chat menus, guides
  • !translation redirect; !translation-threads / !translation-in-chat and near-miss aliases
  • In-chat group-wide: !translate-all-on es en → quote-replies; !translate-all-off stops group-wide only
  • In-chat personal: !translate-me-on es en for one author; personal pair wins over group-wide for that user
  • !enable-threads clears group-wide + all personal in-chat auto; pending !translate-me-thread completes after a refused subscribe
  • Language Threads: !translate-me-thread es; sidecar welcome lists thread commands; !commands works in sidecar only; !leave from sidecar; !enable-in-chat from main tears down and notifies threads
  • After in-chat → threads switch, messages in existing sidecars still relay (internal/send id reconcile)
  • Enabling in-chat while threads are active (or the reverse) refuses with switch hint; after enable switch, pending enable applies
  • Hub !privacy (not role-suffixed); paired-group !verify <text> yields Translation/Transcription-labeled quotes
  • !transcription invite posts Voice Transcription menu; auto-transcribe starts off; !transcribe-on then voice notes; !transcribe while auto on explains no need
  • Translation bot auto-joins a new group invite; transcription bot joins only when translation peer is already a member (skips otherwise / when PEER_PHONE unset)
  • Peer not UNTRUSTED on either bot (GET /v1/identities/{phone}); no Untrusted Identity send errors in logs after startup trust
  • !translate-all-on + !transcribe-on → voice note → transcript → pair-language quote-reply from translation bot
  • Manual quote !translate <lang> still works with or without auto
  • npm run ci green

@daopunk daopunk changed the title feat: split threads and in-chat menus with per-person auto-translate feat: bread bot menus with threads vs in-chat split and per-person auto Aug 5, 2026
@daopunk daopunk changed the title feat: bread bot menus with threads vs in-chat split and per-person auto feat: bread bot translation hubs with threads/in-chat split and switch hardening Aug 5, 2026
@daopunk daopunk changed the title feat: bread bot translation hubs with threads/in-chat split and switch hardening feat: bread bot hubs with threads/in-chat split, switch hardening, and transcription defaults Aug 5, 2026
@daopunk daopunk changed the title feat: bread bot hubs with threads/in-chat split, switch hardening, and transcription defaults feat: bread bot hubs with threads/in-chat split, switch hardening, transcription defaults, and invite auto-accept Aug 5, 2026
@daopunk daopunk changed the title feat: bread bot hubs with threads/in-chat split, switch hardening, transcription defaults, and invite auto-accept feat: bread bot hubs with threads/in-chat split, invite auto-accept, transcript interop, and peer trust Aug 5, 2026
@daopunk
daopunk merged commit d43347f into main Aug 5, 2026
2 checks passed
@daopunk
daopunk deleted the feat/bam branch August 5, 2026 13:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant