slashvibe-mcp 0.8.13 → 0.8.14

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/index.js CHANGED
@@ -599,6 +599,9 @@ class VibeMCPServer {
599
599
  });
600
600
  }
601
601
 
602
+ // The HTTP store creates one random key per logical send and preserves it
603
+ // across its internal transport retries. JSON-RPC ids restart every MCP
604
+ // process, so deriving a durable key from `id` would collapse future sends.
602
605
  const result = await tool.handler(args);
603
606
 
604
607
  // Emit list_changed notification for state-changing tools
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slashvibe-mcp",
3
- "version": "0.8.13",
3
+ "version": "0.8.14",
4
4
  "mcpName": "io.github.vibecodinginc/vibe",
5
5
  "description": "Presence + messaging for terminal coding agents (Claude Code, Codex, Cursor) — the /vibe kernel",
6
6
  "main": "index.js",
package/store/api.js CHANGED
@@ -8,6 +8,7 @@
8
8
 
9
9
  const https = require('https');
10
10
  const http = require('http');
11
+ const { randomUUID } = require('crypto');
11
12
  const config = require('../config');
12
13
  const crypto = require('../crypto');
13
14
  const authStore = require('../auth-store');
@@ -469,6 +470,9 @@ async function sendMessage(from, to, body, type = 'dm', payload = null, options
469
470
  try {
470
471
  let data;
471
472
  let endpoint = '/api/messages';
473
+ // Generated once per logical store call, outside request()'s retry loop. Every
474
+ // transport retry therefore carries the same key and cannot insert a second DM.
475
+ const idempotencyKey = options.idempotencyKey || randomUUID();
472
476
 
473
477
  // V2 API: Uses Postgres, simpler payload
474
478
  const hasAuth = config.hasOAuth();
@@ -479,6 +483,7 @@ async function sendMessage(from, to, body, type = 'dm', payload = null, options
479
483
  to,
480
484
  body: body || '',
481
485
  payload: payload || undefined,
486
+ idempotency_key: idempotencyKey,
482
487
  reply_to: options.replyTo || undefined, // Threaded reply support
483
488
  origin: options.origin || undefined, // work-object lifecycle state
484
489
  };
package/tools/dm.js CHANGED
@@ -283,4 +283,4 @@ async function handler(args) {
283
283
  return response;
284
284
  }
285
285
 
286
- module.exports = { definition, handler };
286
+ module.exports = { definition, handler };
package/version.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
- "version": "0.8.13",
3
- "updated": "2026-08-10",
4
- "changelog": "One DM now has one Mac notification voice. Buddy owns native notifications; the MCP runtime no longer raises a second macOS banner or polls notification-only endpoints. The stdio server also exits explicitly when its host closes the pipe or sends a termination signal.",
2
+ "version": "0.8.14",
3
+ "updated": "2026-08-12",
4
+ "changelog": "Message retries no longer disappear or collide when an MCP host restarts. Each logical DM or reply gets one fresh key that survives its HTTP transport retries, while recycled JSON-RPC request IDs never become durable identities across sessions.",
5
5
  "features": [
6
- "Buddy is the single native Mac notifier while active-terminal MCP delivery stays unchanged",
7
- "The packed MCP artifact contains no native desktop notification code",
8
- "Stdio EOF, close, disconnect, and termination signals share one graceful shutdown path"
6
+ "DM and reply transport retries reuse one caller-owned key without reusing it across MCP sessions",
7
+ "Server-side replays return the original durable message and do not repeat notification or analytics effects",
8
+ "Newly registered senders remain able to message while Actor ownership is still in shadow adoption"
9
9
  ],
10
10
  "deprecated": [],
11
11
  "breaking": false,