slashvibe-mcp 0.2.7 → 0.2.9

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.
Files changed (188) hide show
  1. package/README.md +0 -1
  2. package/config.js +5 -145
  3. package/crypto.js +8 -3
  4. package/index.js +218 -92
  5. package/notify.js +0 -97
  6. package/package.json +6 -16
  7. package/protocol/index.js +1 -88
  8. package/store/api.js +54 -228
  9. package/store/profiles.js +12 -160
  10. package/tools/_actions.js +13 -332
  11. package/tools/_shared/index.js +0 -64
  12. package/tools/artifact-create.js +11 -17
  13. package/tools/artifact-view.js +1 -31
  14. package/tools/artifacts-buy.js +111 -0
  15. package/tools/artifacts-price.js +43 -47
  16. package/tools/connect.js +284 -0
  17. package/tools/crossword.js +1 -17
  18. package/tools/discover.js +34 -314
  19. package/tools/dm.js +74 -61
  20. package/tools/drawing.js +1 -1
  21. package/tools/echo.js +0 -16
  22. package/tools/feed.js +6 -38
  23. package/tools/game.js +2 -2
  24. package/tools/gigs-apply.js +99 -0
  25. package/tools/gigs-browse.js +114 -0
  26. package/tools/gigs-complete.js +128 -0
  27. package/tools/gigs-post.js +140 -0
  28. package/tools/handoff.js +1 -7
  29. package/tools/help.js +3 -3
  30. package/tools/idea.js +1 -8
  31. package/tools/inbox.js +28 -293
  32. package/tools/init.js +36 -691
  33. package/tools/live-off.js +109 -0
  34. package/tools/live-watch.js +176 -0
  35. package/tools/live.js +128 -0
  36. package/tools/open.js +5 -42
  37. package/tools/party-game.js +1 -1
  38. package/tools/presence-agent.js +0 -7
  39. package/tools/proof-of-work.js +105 -96
  40. package/tools/report.js +1 -1
  41. package/tools/request.js +2 -16
  42. package/tools/sessions-browse.js +105 -0
  43. package/tools/settings.js +3 -126
  44. package/tools/ship.js +3 -9
  45. package/tools/solo-game.js +1 -1
  46. package/tools/start.js +88 -288
  47. package/tools/status.js +6 -53
  48. package/tools/suggest-tags.js +8 -6
  49. package/tools/update.js +1 -1
  50. package/tools/wallet.js +176 -87
  51. package/tools/whats-happening.js +125 -0
  52. package/tools/who.js +2 -24
  53. package/tools/x-mentions.js +1 -1
  54. package/version.json +3 -12
  55. package/analytics.js +0 -107
  56. package/auth-store.js +0 -148
  57. package/auto-update.js +0 -125
  58. package/bridges/bridge-monitor.js +0 -388
  59. package/bridges/discord-bot.js +0 -431
  60. package/bridges/farcaster.js +0 -299
  61. package/bridges/telegram.js +0 -261
  62. package/bridges/webhook-health.js +0 -420
  63. package/bridges/webhook-server.js +0 -437
  64. package/bridges/whatsapp.js +0 -441
  65. package/bridges/x-webhook.js +0 -423
  66. package/games/arcade.js +0 -406
  67. package/games/chess.js +0 -451
  68. package/games/colorguess.js +0 -343
  69. package/games/crossword-words.js +0 -171
  70. package/games/crossword.js +0 -461
  71. package/games/drawing.js +0 -347
  72. package/games/gameroulette.js +0 -300
  73. package/games/gamerouter.js +0 -336
  74. package/games/gamestatus.js +0 -337
  75. package/games/guessnumber.js +0 -209
  76. package/games/hangman.js +0 -279
  77. package/games/memory.js +0 -338
  78. package/games/multiplayer-tictactoe.js +0 -389
  79. package/games/pixelart.js +0 -399
  80. package/games/quickduel.js +0 -354
  81. package/games/riddle.js +0 -371
  82. package/games/rockpaperscissors.js +0 -291
  83. package/games/snake.js +0 -406
  84. package/games/storybuilder.js +0 -343
  85. package/games/tictactoe.js +0 -345
  86. package/games/twentyquestions.js +0 -286
  87. package/games/twotruths.js +0 -207
  88. package/games/werewolf.js +0 -508
  89. package/games/wordassociation.js +0 -247
  90. package/games/wordchain.js +0 -135
  91. package/intelligence/index.js +0 -45
  92. package/intelligence/infer.js +0 -316
  93. package/intelligence/interests.js +0 -369
  94. package/intelligence/patterns.js +0 -651
  95. package/intelligence/proactive.js +0 -358
  96. package/intelligence/serendipity.js +0 -306
  97. package/memory.js +0 -166
  98. package/notification-emitter.js +0 -77
  99. package/tools/_discovery-enhanced.js +0 -290
  100. package/tools/_discovery.js +0 -439
  101. package/tools/_proactive-discovery.js +0 -301
  102. package/tools/_work-context.js +0 -338
  103. package/tools/_work-context.manual-test.js +0 -199
  104. package/tools/_work-context.test.js +0 -260
  105. package/tools/admin-inbox.js +0 -218
  106. package/tools/agent-treasury.js +0 -288
  107. package/tools/analytics.js +0 -191
  108. package/tools/approve.js +0 -197
  109. package/tools/arcade.js +0 -173
  110. package/tools/ask-expert.js +0 -160
  111. package/tools/auto-suggest-connections.js +0 -304
  112. package/tools/become-expert.js +0 -150
  113. package/tools/bootstrap-skills.js +0 -231
  114. package/tools/bridge-dashboard.js +0 -342
  115. package/tools/bridge-health.js +0 -400
  116. package/tools/bridge-live.js +0 -384
  117. package/tools/bridges.js +0 -383
  118. package/tools/broadcast.js +0 -286
  119. package/tools/chat.js +0 -202
  120. package/tools/collaborative-drawing.js +0 -286
  121. package/tools/colorguess.js +0 -281
  122. package/tools/discover-insights.js +0 -379
  123. package/tools/discover-momentum.js +0 -256
  124. package/tools/discovery-analytics.js +0 -345
  125. package/tools/discovery-auto-suggest.js +0 -275
  126. package/tools/discovery-bootstrap.js +0 -267
  127. package/tools/discovery-daily.js +0 -375
  128. package/tools/discovery-dashboard.js +0 -385
  129. package/tools/discovery-digest.js +0 -314
  130. package/tools/discovery-hub.js +0 -357
  131. package/tools/discovery-insights.js +0 -384
  132. package/tools/discovery-momentum.js +0 -281
  133. package/tools/discovery-monitor.js +0 -319
  134. package/tools/discovery-proactive.js +0 -300
  135. package/tools/draw.js +0 -317
  136. package/tools/earnings.js +0 -126
  137. package/tools/farcaster.js +0 -307
  138. package/tools/follow.js +0 -224
  139. package/tools/forget.js +0 -119
  140. package/tools/friends.js +0 -192
  141. package/tools/games-catalog.js +0 -376
  142. package/tools/games.js +0 -313
  143. package/tools/genesis.js +0 -233
  144. package/tools/gig-browse.js +0 -206
  145. package/tools/gig-complete.js +0 -139
  146. package/tools/guessnumber.js +0 -194
  147. package/tools/hangman.js +0 -129
  148. package/tools/l2-bridge.js +0 -272
  149. package/tools/l2-status.js +0 -217
  150. package/tools/l2.js +0 -206
  151. package/tools/migrate.js +0 -156
  152. package/tools/mint.js +0 -377
  153. package/tools/multiplayer-tictactoe.js +0 -303
  154. package/tools/notifications.js +0 -415
  155. package/tools/observe.js +0 -200
  156. package/tools/onboarding.js +0 -147
  157. package/tools/plan.js +0 -225
  158. package/tools/pulse.js +0 -218
  159. package/tools/recall.js +0 -147
  160. package/tools/remember.js +0 -86
  161. package/tools/reputation.js +0 -175
  162. package/tools/riddle.js +0 -240
  163. package/tools/run-bootstrap.js +0 -69
  164. package/tools/schedule.js +0 -367
  165. package/tools/session.js +0 -420
  166. package/tools/session_price.js +0 -128
  167. package/tools/shipback.js +0 -326
  168. package/tools/skills-analytics.js +0 -349
  169. package/tools/skills-bootstrap.js +0 -301
  170. package/tools/skills-dashboard.js +0 -268
  171. package/tools/skills.js +0 -380
  172. package/tools/smart-intro.js +0 -353
  173. package/tools/social-processor.js +0 -445
  174. package/tools/storybuilder.js +0 -331
  175. package/tools/stuck.js +0 -297
  176. package/tools/subscribe.js +0 -148
  177. package/tools/subscriptions.js +0 -134
  178. package/tools/tag-suggestions.js +0 -257
  179. package/tools/telegram-bot.js +0 -183
  180. package/tools/telegram-setup.js +0 -214
  181. package/tools/tip.js +0 -120
  182. package/tools/token.js +0 -103
  183. package/tools/twentyquestions.js +0 -143
  184. package/tools/watch.js +0 -157
  185. package/tools/webhook-test.js +0 -388
  186. package/tools/withdraw.js +0 -145
  187. package/tools/work-summary.js +0 -96
  188. package/tools/workshop.js +0 -327
package/README.md CHANGED
@@ -60,7 +60,6 @@ The MCP server connects to `slashvibe.dev` for:
60
60
 
61
61
  ## Related
62
62
 
63
- - [GitHub](https://github.com/VibeCodingInc/vibe-mcp) - Source code
64
63
  - [slashvibe.dev](https://slashvibe.dev) - Web presence
65
64
  - [Spirit Protocol](https://spiritprotocol.io) - Parent ecosystem
66
65
  - [AIRC](https://airc.chat) - Agent identity protocol
package/config.js CHANGED
@@ -66,15 +66,7 @@ function save(config) {
66
66
  publicKey: config.publicKey || existing.publicKey || null,
67
67
  privateKey: config.privateKey || existing.privateKey || null,
68
68
  // Guided mode (AskUserQuestion menus)
69
- guided_mode: config.guided_mode !== undefined ? config.guided_mode : existing.guided_mode,
70
- // Notification level
71
- notifications: config.notifications || existing.notifications || null,
72
- // GitHub Activity settings
73
- github_activity_enabled: config.github_activity_enabled !== undefined ? config.github_activity_enabled : existing.github_activity_enabled,
74
- github_activity_privacy: config.github_activity_privacy || existing.github_activity_privacy || null,
75
- // Privy OAuth token (persisted across MCP process restarts)
76
- privyToken: config.privyToken || existing.privyToken || null,
77
- authMethod: config.authMethod || existing.authMethod || null
69
+ guided_mode: config.guided_mode !== undefined ? config.guided_mode : existing.guided_mode
78
70
  };
79
71
  fs.writeFileSync(PRIMARY_CONFIG, JSON.stringify(data, null, 2));
80
72
  }
@@ -211,80 +203,11 @@ function setAuthToken(token, sessionId = null) {
211
203
  }
212
204
 
213
205
  function getAuthToken() {
214
- // First check session data
215
206
  const data = getSessionData();
216
207
  if (data?.token) return data.token;
217
-
218
- // Fall back to shared config (persisted across MCP process restarts)
219
- const cfg = load();
220
- return cfg?.privyToken || null;
221
- }
222
-
223
- /**
224
- * Save Privy JWT token (used after browser OAuth flow)
225
- * @param {string} token - Privy access token
226
- */
227
- function savePrivyToken(token) {
228
- // Save to session data
229
- const data = getSessionData() || {};
230
- saveSessionData({
231
- ...data,
232
- sessionId: data.sessionId || generateSessionId(),
233
- token,
234
- authMethod: 'privy' // Track that this is a Privy token
235
- });
236
-
237
- // Also save to shared config for persistence across MCP restarts
238
- const cfg = load();
239
- cfg.privyToken = token;
240
- cfg.authMethod = 'privy';
241
- save(cfg);
242
- }
243
-
244
- /**
245
- * Check if user has Privy auth (vs legacy keypair)
246
- * Accepts both 'privy' and 'browser' as valid auth methods
247
- */
248
- function hasPrivyAuth() {
249
- const validAuthMethods = ['privy', 'browser'];
250
-
251
- const data = getSessionData();
252
- if (validAuthMethods.includes(data?.authMethod) && data?.token) return true;
253
-
254
- const cfg = load();
255
- return validAuthMethods.includes(cfg?.authMethod) && cfg?.privyToken;
256
- }
257
-
258
- /**
259
- * Remove keypair after migration to Privy
260
- * Clears private key from config (security improvement)
261
- */
262
- function removeKeypair() {
263
- const cfg = load();
264
- delete cfg.publicKey;
265
- delete cfg.privateKey;
266
- save(cfg);
267
-
268
- // Also clear from session
269
- const data = getSessionData();
270
- if (data) {
271
- delete data.publicKey;
272
- delete data.privateKey;
273
- saveSessionData(data);
274
- }
275
- }
276
-
277
- /**
278
- * Get auth URL for browser-based GitHub OAuth
279
- * @param {string|null} handle - Custom handle (optional - defaults to GitHub username)
280
- */
281
- function getAuthUrl(handle = null) {
282
- const apiUrl = getApiUrl();
283
- if (handle) {
284
- return `${apiUrl}/api/auth/github?handle=${encodeURIComponent(handle)}`;
285
- }
286
- // No handle = use GitHub username as handle
287
- return `${apiUrl}/api/auth/github`;
208
+ // Fall back to privyToken in config (for persistence across sessions)
209
+ const config = load();
210
+ return config?.privyToken || null;
288
211
  }
289
212
 
290
213
  function clearSession() {
@@ -328,61 +251,11 @@ function setNotifications(level) {
328
251
  save(config);
329
252
  }
330
253
 
331
- // GitHub Activity settings
332
- // Shows shipping status based on GitHub commit activity
333
- // Default: false (opt-in for privacy)
334
- function getGithubActivityEnabled() {
335
- const config = load();
336
- return config.github_activity_enabled === true;
337
- }
338
-
339
- function setGithubActivityEnabled(enabled) {
340
- const config = load();
341
- config.github_activity_enabled = enabled;
342
- save(config);
343
- }
344
-
345
- // GitHub Activity privacy level
346
- // Levels: "full" | "status_only" | "off"
347
- // - full: Show repos, commit counts, tech stack (default when enabled)
348
- // - status_only: Just show shipping badge (🔥/⚡), no details
349
- // - off: Disabled completely
350
- function getGithubActivityPrivacy() {
351
- const config = load();
352
- return config.github_activity_privacy || 'full';
353
- }
354
-
355
- function setGithubActivityPrivacy(level) {
356
- const validLevels = ['full', 'status_only', 'off'];
357
- if (!validLevels.includes(level)) {
358
- throw new Error(`Invalid privacy level. Use: ${validLevels.join(', ')}`);
359
- }
360
- const config = load();
361
- config.github_activity_privacy = level;
362
- save(config);
363
- }
364
-
365
254
  // API URL — central endpoint for all API calls
366
255
  function getApiUrl() {
367
256
  return process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
368
257
  }
369
258
 
370
- // ─────────────────────────────────────────────────────────────
371
- // Generic key-value store for ephemeral session state
372
- // Used by presence-agent, mute, and other tools for runtime state
373
- // NOT persisted to disk — resets when MCP server restarts
374
- // ─────────────────────────────────────────────────────────────
375
- const sessionState = {};
376
-
377
- function get(key, defaultValue = null) {
378
- return sessionState[key] !== undefined ? sessionState[key] : defaultValue;
379
- }
380
-
381
- function set(key, value) {
382
- sessionState[key] = value;
383
- return value;
384
- }
385
-
386
259
  module.exports = {
387
260
  VIBE_DIR,
388
261
  CONFIG_FILE,
@@ -406,18 +279,5 @@ module.exports = {
406
279
  setGuidedMode,
407
280
  getNotifications,
408
281
  setNotifications,
409
- // GitHub Activity settings
410
- getGithubActivityEnabled,
411
- setGithubActivityEnabled,
412
- getGithubActivityPrivacy,
413
- setGithubActivityPrivacy,
414
- getApiUrl,
415
- // Privy OAuth helpers
416
- savePrivyToken,
417
- hasPrivyAuth,
418
- removeKeypair,
419
- getAuthUrl,
420
- // Generic key-value for ephemeral session state
421
- get,
422
- set
282
+ getApiUrl
423
283
  };
package/crypto.js CHANGED
@@ -143,9 +143,10 @@ function generateMessageId() {
143
143
  * @param {string} [params.body] Message body
144
144
  * @param {object} [params.payload] Message payload
145
145
  * @param {string} privateKeyBase64 Sender's private key
146
+ * @param {string} publicKeyBase64 Sender's public key (required for verification)
146
147
  * @returns {object} Complete signed message
147
148
  */
148
- function createSignedMessage({ from, to, body, payload }, privateKeyBase64) {
149
+ function createSignedMessage({ from, to, body, payload }, privateKeyBase64, publicKeyBase64) {
149
150
  const message = {
150
151
  v: '0.1',
151
152
  id: generateMessageId(),
@@ -158,8 +159,9 @@ function createSignedMessage({ from, to, body, payload }, privateKeyBase64) {
158
159
  if (body) message.body = body;
159
160
  if (payload) message.payload = payload;
160
161
 
161
- // Sign
162
+ // Sign and include public key for verification
162
163
  message.signature = sign(message, privateKeyBase64);
164
+ message.publicKey = publicKeyBase64;
163
165
 
164
166
  return message;
165
167
  }
@@ -171,9 +173,10 @@ function createSignedMessage({ from, to, body, payload }, privateKeyBase64) {
171
173
  * @param {string} status Status (online/idle/busy/offline)
172
174
  * @param {string} [context] Activity context
173
175
  * @param {string} privateKeyBase64 User's private key
176
+ * @param {string} publicKeyBase64 User's public key (required for verification)
174
177
  * @returns {object} Signed heartbeat
175
178
  */
176
- function createSignedHeartbeat(handle, status, context, privateKeyBase64) {
179
+ function createSignedHeartbeat(handle, status, context, privateKeyBase64, publicKeyBase64) {
177
180
  const heartbeat = {
178
181
  handle,
179
182
  status,
@@ -183,7 +186,9 @@ function createSignedHeartbeat(handle, status, context, privateKeyBase64) {
183
186
 
184
187
  if (context) heartbeat.context = context;
185
188
 
189
+ // Sign and include public key for verification
186
190
  heartbeat.signature = sign(heartbeat, privateKeyBase64);
191
+ heartbeat.publicKey = publicKeyBase64;
187
192
 
188
193
  return heartbeat;
189
194
  }