ciphermesh 2.13.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,75 @@
3
3
  Notable changes per release. Older versions are reconstructed from the git
4
4
  history — the commit bodies and pull requests remain the fuller record.
5
5
 
6
+ ## 2.14.0
7
+
8
+ **The chat, read properly.** Three things a user reported in the same session:
9
+ notifications wrecking the screen, Shift+Enter sending instead of breaking a
10
+ line, and long messages running the whole width of the terminal.
11
+
12
+ ### Changed
13
+
14
+ - **Messages are laid out as blocks.** A header naming the sender, then the text
15
+ wrapped at 65 % of the window (78 columns at most) and indented under it,
16
+ instead of one line handed to the terminal's own wrapping and left to run into
17
+ the border. Own messages are no longer right-aligned — everything starts at the
18
+ same column and a coloured rule down the left says what a message is: yellow
19
+ when it mentions you, magenta for a DM, the accent for your own.
20
+
21
+ Runs from one sender fold under a single header, but only inside the same
22
+ minute, so folding a run never costs you a timestamp. Notices — system, error,
23
+ `/me`, tombstones — share the gutter and wrap with a hanging indent, though at
24
+ the window's width rather than the reading width, so `/help`'s table is not
25
+ folded in half on a window with room to spare.
26
+
27
+ Everything is laid out again when the terminal is resized, stored room buffers
28
+ included, so the scrollback is never left measured for a window you no longer
29
+ have.
30
+
31
+ ### Added
32
+
33
+ - **Shift+Enter inserts a newline.** A terminal cannot tell it from Enter unless
34
+ asked, so CipherMesh now negotiates the kitty keyboard protocol and xterm's
35
+ `modifyOtherKeys` on startup and undoes both on the way out. What the terminal
36
+ reports back is decoded ahead of the UI's key parser, which could not read it —
37
+ and without that step would have typed `13;2u` into the composer.
38
+
39
+ **Alt+Enter was broken too** and works now, on every terminal, protocol or not;
40
+ Ctrl+J still does the same. `CIPHERMESH_LEGACY_KEYS=1` turns the negotiation off
41
+ for terminals that dislike it.
42
+
43
+ ### Fixed
44
+
45
+ - **Desktop notifications no longer wreck the chat on Windows.** SnoreToast, the
46
+ back-end behind `node-notifier`, ignores the pipes it is given when
47
+ notifications are disabled for the application and writes its diagnostics to
48
+ the attached console instead — the one the chat is drawn on. A room could
49
+ become unreadable, one burst per incoming message, with `/notify off` the only
50
+ way out.
51
+
52
+ Notifications are now delivered on Windows by a detached helper with no console
53
+ of its own, so nothing it prints can reach the terminal. The first refusal also
54
+ mutes them for the session and says so once, in one line with the reason
55
+ summarised rather than the raw command line; sound alerts keep working and
56
+ `/notify on` retries. And they are rate-limited to one per three seconds, which
57
+ was the other half of the complaint.
58
+
59
+ ### Internal
60
+
61
+ - **`docs/ARCHITECTURE.md` matches the code again, and a test keeps it that
62
+ way.** It listed `play-sound` as a production dependency, which it is not, and
63
+ omitted seven of the eleven that are; its directory tree named files that do
64
+ not exist and 2 of the 27 modules under `src/shared/`; about half the document
65
+ was still Portuguese; and it called the project SecureLAN Chat, three renames
66
+ later. `test/architecture-doc.test.js` now fails on any of those — the same
67
+ shape as the command-list check, for the same reason.
68
+
69
+ - The UI can be tested headlessly. `UI` takes the streams blessed drives, so the
70
+ layout — wrapping, alignment, relayout — runs against a fake terminal instead
71
+ of only being checked by eye.
72
+
73
+ - eslint 10.9.1, github/codeql-action 4.37.9.
74
+
6
75
  ## 2.13.0
7
76
 
8
77
  **Multi-device.** One identity, several devices, and none of them holding a copy
package/README.md CHANGED
@@ -54,7 +54,7 @@ forwarding, survives CGNAT).
54
54
  | 🗂️ | **Encrypted local history** | Opt-in (passphrase only), Argon2id + XSalsa20-Poly1305, `/search` & `/export` |
55
55
  | 🖼️ | **Image previews** | Received photos render right in the chat as colored half-blocks |
56
56
  | 📎 | **Resumable transfers** | Lost chunks are re-requested; reconnects resume from where they stopped |
57
- | 💬 | **Modern chat feel** | Right-aligned own messages, per-user emoji avatars, replies with quotes, `:fire:` → 🔥 |
57
+ | 💬 | **Modern chat feel** | Messages laid out as wrapped blocks with a coloured rule on your own, per-user emoji avatars, replies with quotes, `:fire:` → 🔥 |
58
58
  | 🎞️ | **Animated UI** | Splash intro, reconnect spinner, live transfer bars (shimmer + ETA), a lock-closing handshake on connect, and a pulsing "new messages ↓" pill |
59
59
  | 👻 | **Deniable & ephemeral** | Symmetric-crypto deniable mode; ephemeral messages _burn away_ char-by-char when they expire |
60
60
  | 🔒 | **Private rooms** | `/create <room> <password>` — zero-knowledge: the password never leaves your machine (Argon2id → Ed25519 challenge-response) and room content gets an extra symmetric layer the relay can't fake its way into |
@@ -302,13 +302,14 @@ A green **✓** next to a name marks a SAS-verified peer; a red **✗** flags a
302
302
  | `/react <emoji>` | React to the last message — the emoji lands **on the message**, with a count when several people react |
303
303
  | `/edit` `/delete` | Edit or delete your last message — the **original line is rewritten in place** (marked _(edited)_) or replaced by a tombstone, instead of a new line you have to mentally staple to it |
304
304
  | `/pin` `/unpin` `/pins` | Pin messages |
305
- | `/sound` `/notify` | Sound / desktop notifications |
305
+ | `/sound` | Sound alerts on incoming messages |
306
+ | `/notify` | Desktop notifications — rate-limited, and muted for the session (with a line saying why) if the OS refuses them |
306
307
  | `/dnd [on\|off\|mentions\|HH:MM-HH:MM]` | Do-not-disturb, mentions-only, or quiet hours |
307
308
  | `/clear` | Clear the chat |
308
309
 
309
310
  </details>
310
311
 
311
- Typing `:fire:` anywhere becomes 🔥 (Tab autocompletes shortcodes). **Ctrl+K** opens a fuzzy command palette, **Ctrl+E** an emoji picker. PageUp/PageDown scroll the history. **Alt+Enter** (or Shift+Enter where the terminal supports it, plus Ctrl+J) inserts a newline for multi-line messages; Enter sends. Pasting multi-line text (code included) keeps its line breaks — paste, check, Enter. Markdown works: \`code\`, **bold**, _italic_, links, plus fenced \`\`\` code blocks and | tables |. Received images preview inline (half-blocks) and render full-res with `/img` on kitty/iTerm2. Day separators and message grouping keep the log clean.
312
+ Typing `:fire:` anywhere becomes 🔥 (Tab autocompletes shortcodes). **Ctrl+K** opens a fuzzy command palette, **Ctrl+E** an emoji picker. PageUp/PageDown scroll the history. **Shift+Enter** inserts a newline for multi-line messages — CipherMesh negotiates the kitty keyboard protocol / `modifyOtherKeys` on startup so the terminal can tell it apart from Enter, and **Alt+Enter** and **Ctrl+J** do the same on terminals that support neither (`CIPHERMESH_LEGACY_KEYS=1` turns the negotiation off). Enter sends. Pasting multi-line text (code included) keeps its line breaks — paste, check, Enter. Markdown works: \`code\`, **bold**, _italic_, links, plus fenced \`\`\` code blocks and | tables |. Received images preview inline (half-blocks) and render full-res with `/img` on kitty/iTerm2. Messages are laid out as blocks — a header naming the sender, then the text wrapped well short of the window and indented under it, with a coloured rule down the left of your own, of DMs and of anything that mentions you. Day separators and message grouping keep the log clean.
312
313
 
313
314
  ### First run & config file
314
315
 
package/README.pt-BR.md CHANGED
@@ -54,7 +54,7 @@ forwarding, imune a CGNAT).
54
54
  | 🗂️ | **Histórico local cifrado** | Opt-in (só com passphrase), Argon2id + XSalsa20-Poly1305, `/search` e `/export` |
55
55
  | 🖼️ | **Preview de imagens** | Fotos recebidas renderizam no chat em half-blocks coloridos |
56
56
  | 📎 | **Transferências com resume** | Chunks perdidos são re-pedidos; reconexão retoma de onde parou |
57
- | 💬 | **Cara de app moderno** | Suas mensagens à direita, avatar de emoji por usuário, reply com citação, `:fire:` → 🔥 |
57
+ | 💬 | **Cara de app moderno** | Mensagens em blocos com quebra de linha e uma barra colorida nas suas, avatar de emoji por usuário, reply com citação, `:fire:` → 🔥 |
58
58
  | 🎞️ | **Interface animada** | Splash na abertura, spinner de reconexão, barra de transferência viva (shimmer + ETA), cadeado fechando no handshake e um selo pulsante "novas mensagens ↓" |
59
59
  | 👻 | **Deniable e efêmeras** | Modo de negação plausível (crypto simétrica); mensagens efêmeras _queimam_ caractere a caractere ao expirar |
60
60
  | 🔒 | **Salas privadas** | `/create <sala> <senha>` — zero-knowledge: a senha nunca sai da sua máquina (Argon2id → challenge-response Ed25519) e o conteúdo da sala ganha uma camada simétrica extra que nem um relay malicioso atravessa |
@@ -302,14 +302,15 @@ Um **✓** verde ao lado de um nome indica um peer verificado por SAS; um **✗*
302
302
  | `/react <emoji>` | Reage à última mensagem — o emoji aparece **na própria mensagem**, com contagem quando várias pessoas reagem |
303
303
  | `/edit` `/delete` | Edita ou apaga sua última mensagem — a **linha original é reescrita no lugar** (marcada _(edited)_) ou vira uma lápide, em vez de uma linha nova que você precisa juntar mentalmente à original |
304
304
  | `/pin` `/unpin` `/pins` | Fixa mensagens |
305
- | `/sound` `/notify` | Notificações sonoras / desktop |
305
+ | `/sound` | Alertas sonoros ao receber mensagens |
306
+ | `/notify` | Notificações de desktop — com limite de frequência, e silenciadas na sessão (com uma linha a dizer porquê) se o SO as recusar |
306
307
  | `/dnd [on\|off\|mentions\|HH:MM-HH:MM]` | Não perturbe, só menções, ou horário silencioso |
307
308
  | `/clear` | Limpa o chat |
308
309
 
309
310
  </details>
310
311
 
311
312
  Digitar `:fire:` em qualquer lugar vira 🔥 (Tab autocompleta shortcodes).
312
- **Ctrl+K** abre uma paleta de comandos fuzzy, **Ctrl+E** um seletor de emoji. PageUp/PageDown rolam o histórico. **Alt+Enter** (ou Shift+Enter onde o terminal suporta, além de Ctrl+J) insere uma nova linha para mensagens de várias linhas; Enter envia. Colar texto multi-linha (código incluso) preserva as quebras — cola, confere, Enter. Markdown funciona: \`código\`, **negrito**, _itálico_, links, além de blocos de código \`\`\` e | tabelas |. Imagens recebidas têm preview inline (half-blocks) e renderizam em alta resolução com `/img` no kitty/iTerm2. Separadores de dia e agrupamento de mensagens deixam o log limpo.
313
+ **Ctrl+K** abre uma paleta de comandos fuzzy, **Ctrl+E** um seletor de emoji. PageUp/PageDown rolam o histórico. **Shift+Enter** insere uma nova linha para mensagens de várias linhas — o CipherMesh negocia o kitty keyboard protocol / `modifyOtherKeys` no arranque para o terminal conseguir distingui-lo do Enter, e **Alt+Enter** e **Ctrl+J** fazem o mesmo em terminais que não suportam nenhum dos dois (`CIPHERMESH_LEGACY_KEYS=1` desliga a negociação). Enter envia. Colar texto multi-linha (código incluso) preserva as quebras — cola, confere, Enter. Markdown funciona: \`código\`, **negrito**, _itálico_, links, além de blocos de código \`\`\` e | tabelas |. Imagens recebidas têm preview inline (half-blocks) e renderizam em alta resolução com `/img` no kitty/iTerm2. As mensagens são desenhadas em blocos — um cabeçalho com o remetente e, por baixo, o texto quebrado bem antes da largura da janela, com uma barra colorida à esquerda nas suas, nas DMs e em tudo o que te mencione. Separadores de dia e agrupamento de mensagens deixam o log limpo.
313
314
 
314
315
  ### Primeira execução & arquivo de config
315
316