@sym-bot/mesh-channel 0.3.2 → 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.2",
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,31 @@
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
+
3
29
  ## 0.3.2
4
30
 
5
31
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sym-bot/mesh-channel",
3
- "version": "0.3.2",
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": {
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) => {