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 +3 -0
- package/package.json +1 -1
- package/store/api.js +5 -0
- package/tools/dm.js +1 -1
- package/version.json +6 -6
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
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
package/version.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.8.
|
|
3
|
-
"updated": "2026-08-
|
|
4
|
-
"changelog": "
|
|
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
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
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,
|