@sym-bot/mesh-channel 0.3.1 → 0.3.3

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sym-mesh-channel",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Real-time Claude-to-Claude mesh. Agent-to-agent cognitive signals over Bonjour LAN or WebSocket relay.",
5
5
  "author": {
6
6
  "name": "Hongwei Xu",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.3
4
+
5
+ ### Fixed
6
+
7
+ - **Real-time duplex for CAT7 CMBs.** The `cmb-accepted` handler now
8
+ stores the rendered CMB body under an `[mNNN]` ID and includes that
9
+ ID in the channel notification, matching the contract stated in the
10
+ MCP instructions ("Messages arrive as compact headers with [mNNN] IDs
11
+ — use sym_fetch to read the full content") and the behaviour of the
12
+ raw-text `message` path.
13
+
14
+ Previously only the legacy raw-text `message` event persisted bodies
15
+ to `MESSAGE_STORE` — the primary `cmb-accepted` event (fired for
16
+ every structured CMB delivered via `sym_send` / `sym_observe`) pushed
17
+ a headline with no `[mNNN]` and left no retrievable body. Inbound
18
+ CMBs were admitted to the SVAF-backed memory store and surfaced by
19
+ `sym_recall` as compact headlines, but `sym_fetch` could not return
20
+ their content — the duplex was effectively headline-only for the 99%
21
+ case of real mesh traffic.
22
+
23
+ Symptom: after the 0.3.2 Mac↔Win fix restored bidirectional packet
24
+ flow, peers' structured replies appeared in `sym_recall` but returned
25
+ *"expired or invalid ID"* from `sym_fetch` — because `storeMessage()`
26
+ had never been called for them. Now both the raw-text and CAT7 paths
27
+ persist bodies identically.
28
+
29
+ ## 0.3.2
30
+
31
+ ### Fixed
32
+
33
+ - **Pulls in `@sym-bot/sym` 0.5.1** — fixes Mac↔Windows peer connections
34
+ over LAN. Prior releases shipped a Bonjour advertisement whose SRV
35
+ target was the bare Windows NetBIOS hostname (e.g. `xmesh-hp.`) with
36
+ no `.local` suffix. macOS mDNSResponder only resolves `.local.` mDNS
37
+ names, so Macs could discover Windows peers via bonjour browse but
38
+ failed to open the outbound TCP connection. CMBs targeted at Windows
39
+ nodes never arrived; no replies came back. Full diagnosis in sym
40
+ 0.5.1 CHANGELOG.
41
+
42
+ Upgrade required on both sides to restore Mac↔Windows traffic.
43
+ Existing Windows identities with a bare hostname are auto-migrated
44
+ on next node start; no manual config edit needed.
45
+
3
46
  ## 0.3.1
4
47
 
5
48
  ### Fixed
package/README.md CHANGED
@@ -236,7 +236,7 @@ Clear-eyed about what's not there yet:
236
236
  - **Corporate networks often block mDNS multicast.** If LAN discovery fails on the same wifi, fall back to a relay.
237
237
  - **No offline directory of known groups.** `sym_groups_discover` only shows groups with at least one node currently online. For cross-network relay-backed groups, invite URLs must be shared out of band.
238
238
  - **One mesh identity per process.** Two Claude Code sessions on the same machine with the same `SYM_NODE_NAME` will collide — the second one exits with `EIDENTITYLOCK`. Use distinct `SYM_NODE_NAME`s or install per-project (above).
239
- - **No end-to-end encryption of CMB payloads.** Transport is authenticated (Ed25519, relay tokens) but relay operators can read message bodies. E2E encryption is on the MMP roadmap.
239
+ - **E2E encryption is per-peer-pair, not universal.** CMB field content is encrypted with Curve25519 key agreement + AES-256-GCM between peers that both advertise an E2E public key on handshake. Peers without E2E support fall back to plaintext for backward compatibility. Outer frame metadata (sender ID, timestamp, lineage) stays plaintext — enough for relay forwarding and SVAF evaluation without seeing bodies.
240
240
 
241
241
  ## Troubleshooting
242
242
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sym-bot/mesh-channel",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "MCP server — real-time agent-to-agent cognition for Claude Code remote teams via the SYM mesh.",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "@modelcontextprotocol/sdk": "^1.12.1",
25
- "@sym-bot/sym": "^0.5.0"
25
+ "@sym-bot/sym": "^0.5.1"
26
26
  },
27
27
  "engines": {
28
28
  "node": ">=18"
package/server.js CHANGED
@@ -240,7 +240,15 @@ function registerNodeHandlers(n) {
240
240
  if (!isPeerAllowed(source)) return;
241
241
  const focus = entry.cmb?.fields?.focus?.text || entry.content || '';
242
242
  const mood = entry.cmb?.fields?.mood?.text || '';
243
- pushChannel('cmb', `[${source}] ${focus}${mood && mood !== 'neutral' ? ` (mood: ${mood})` : ''}`);
243
+ const moodSuffix = mood && mood !== 'neutral' ? ` (mood: ${mood})` : '';
244
+ // Store the rendered CMB body so the agent can sym_fetch it by [mNNN] ID,
245
+ // matching the contract stated in the MCP instructions and the behaviour
246
+ // of the raw-text `message` path. Without this, CAT7 CMBs (the primary
247
+ // traffic — sym_send / sym_observe) arrive as headlines with no
248
+ // retrievable body, degrading real-time duplex to headline-only.
249
+ const body = entry.content || focus;
250
+ const msgId = storeMessage(source, body);
251
+ pushChannel('cmb', `[${source}] ${focus}${moodSuffix} [${msgId}]`);
244
252
  });
245
253
 
246
254
  n.on('message', (from, content) => {