docs: comprehensive update for sprints 1-9

Update README, ROADMAP, and mdBook to reflect all sprint deliverables:
rich messaging, file transfer, disappearing messages, Go/TypeScript SDKs,
C FFI, mesh networking (identity, store-and-forward, broadcast), and
security hardening. Add 6 new mdBook guides (REPL reference, Go SDK,
TypeScript SDK + browser demo, rich messaging, file transfer, mesh
networking). Check off 16 completed ROADMAP items across phases 3-9.
This commit is contained in:
2026-03-04 02:10:20 +01:00
parent 4454458e38
commit 4694a3098b
13 changed files with 1084 additions and 134 deletions

View File

@@ -0,0 +1,94 @@
# Rich Messaging
quicproquo supports rich messaging features beyond basic text: reactions, read
receipts, typing indicators, message editing, and message deletion. All
message types are end-to-end encrypted inside MLS ciphertext — the server
only sees opaque bytes.
## Reactions
React to any message with an emoji:
```
/react 👍 # react to the latest message
/react 🎉 3 # react to message at history index 3
```
Reactions are displayed inline with the sender's name. Each reaction
references the target message by its 16-byte message ID.
## Read receipts
Read receipts are sent **automatically** when you receive a Chat or Reply
message. The sender sees a `✓ read` indicator in their message history.
Receipts only trigger on Chat and Reply messages (not on other receipts,
typing indicators, or reactions) to prevent infinite loops.
## Typing indicators
Send a typing indicator to let others know you're composing:
```
/typing
```
Typing indicators timeout after 10 seconds of inactivity. Toggle display of
others' typing with:
```
/typing-notify on
/typing-notify off
```
The session tracks `typing_indicators` state per conversation.
## Editing messages
Edit one of your own messages by history index:
```
/edit 5 Updated text here
```
Only your own messages can be edited. The edit is sent as an `Edit` message
type referencing the original message ID, and the local database is updated on
receipt.
## Deleting messages
Delete one of your own messages:
```
/delete 5
```
Only your own messages can be deleted. A `Delete` message is broadcast to the
group, and the message is removed from the local database on receipt.
## Wire format
All rich message types use the same binary envelope inside the MLS ciphertext:
```
[version: 1 byte][type: 1 byte][payload...]
```
| Type | Code | Payload |
|---|---|---|
| Chat | `0x01` | `[msg_id: 16][body_len: 2 BE][body]` |
| Reply | `0x02` | `[ref_msg_id: 16][body_len: 2 BE][body]` |
| Reaction | `0x03` | `[ref_msg_id: 16][emoji_len: 1][emoji UTF-8]` |
| ReadReceipt | `0x04` | `[msg_id: 16]` |
| Typing | `0x05` | `[active: 1]` (0 = stopped, 1 = typing) |
| Edit | `0x06` | `[ref_msg_id: 16][body_len: 2 BE][body]` |
| Delete | `0x07` | `[ref_msg_id: 16]` |
## Implementation
- **Core serialisation:** `crates/quicproquo-core/src/app_message.rs` — the
`AppMessage` enum with `serialize()` / `deserialize()` methods
- **REPL commands:** `crates/quicproquo-client/src/client/repl.rs` — slash
command handlers
- **Display:** `crates/quicproquo-client/src/client/display.rs` — typing
indicator rendering