slashvibe-mcp 0.3.21 → 0.3.23
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/LICENSE +21 -0
- package/README.md +280 -47
- package/auto-update.js +10 -15
- package/config.js +36 -31
- package/crypto.js +1 -6
- package/debug.js +12 -0
- package/discord.js +19 -19
- package/eslint.config.js +54 -0
- package/index.js +217 -207
- package/intelligence/index.js +2 -9
- package/intelligence/infer.js +10 -16
- package/intelligence/patterns.js +23 -18
- package/intelligence/proactive.js +16 -15
- package/intelligence/serendipity.js +57 -20
- package/memory.js +13 -8
- package/migrate-v2.js +72 -0
- package/notification-emitter.js +2 -2
- package/notify.js +39 -14
- package/package.json +28 -29
- package/post-install.js +141 -0
- package/presence.js +2 -2
- package/prompts.js +5 -9
- package/protocol/index.js +123 -87
- package/protocol/telegram-commands.js +36 -37
- package/store/api.js +358 -529
- package/store/local.js +9 -10
- package/store/profiles.js +48 -192
- package/store/reservations.js +2 -9
- package/store/skills.js +69 -71
- package/store/sqlite.js +355 -0
- package/test-skills-bootstrap.js +20 -0
- package/test-v2-integration.js +385 -0
- package/tools/_actions.js +48 -387
- package/tools/_connection-queue.js +45 -56
- package/tools/_discovery-enhanced.js +52 -57
- package/tools/_discovery.js +87 -185
- package/tools/{l2-status.js → _experimental/l2-status.js} +68 -70
- package/tools/{shipback.js → _experimental/shipback.js} +4 -3
- package/tools/_proactive-discovery.js +60 -73
- package/tools/_shared/index.js +41 -64
- package/tools/admin-inbox.js +10 -15
- package/tools/agents.js +1 -1
- package/tools/artifact-create.js +13 -23
- package/tools/artifact-view.js +4 -4
- package/tools/{_deprecated/back.js → back.js} +1 -1
- package/tools/bye.js +3 -5
- package/tools/consent.js +2 -2
- package/tools/context.js +9 -10
- package/tools/crossword.js +3 -2
- package/tools/discover.js +94 -356
- package/tools/dm.js +27 -86
- package/tools/doctor.js +12 -41
- package/tools/drawing.js +34 -20
- package/tools/echo.js +11 -11
- package/tools/feed.js +30 -58
- package/tools/follow.js +64 -187
- package/tools/{_deprecated/forget.js → forget.js} +4 -7
- package/tools/game.js +144 -48
- package/tools/handoff.js +6 -8
- package/tools/help.js +3 -3
- package/tools/idea.js +15 -27
- package/tools/inbox.js +121 -293
- package/tools/init.js +54 -151
- package/tools/invite.js +8 -21
- package/tools/migrate.js +27 -24
- package/tools/multiplayer-game.js +50 -40
- package/tools/{_deprecated/mute.js → mute.js} +4 -3
- package/tools/notifications.js +58 -48
- package/tools/observe.js +12 -15
- package/tools/onboarding.js +8 -11
- package/tools/open.js +13 -144
- package/tools/party-game.js +23 -12
- package/tools/patterns.js +2 -1
- package/tools/ping.js +5 -7
- package/tools/react.js +28 -30
- package/tools/{_deprecated/recall.js → recall.js} +5 -10
- package/tools/release.js +4 -2
- package/tools/{_deprecated/remember.js → remember.js} +4 -6
- package/tools/report.js +2 -2
- package/tools/request.js +6 -26
- package/tools/reserve.js +1 -1
- package/tools/session-fork.js +97 -0
- package/tools/session-save.js +109 -0
- package/tools/settings.js +30 -99
- package/tools/ship.js +74 -56
- package/tools/{_deprecated/skills-exchange.js → skills-exchange.js} +38 -39
- package/tools/social-inbox.js +22 -28
- package/tools/social-post.js +24 -27
- package/tools/solo-game.js +54 -46
- package/tools/start.js +14 -148
- package/tools/status.js +21 -68
- package/tools/submit.js +4 -2
- package/tools/suggest-tags.js +36 -33
- package/tools/summarize.js +19 -16
- package/tools/tag-suggestions.js +72 -73
- package/tools/test.js +1 -1
- package/tools/{_deprecated/tictactoe.js → tictactoe.js} +26 -26
- package/tools/token.js +4 -4
- package/tools/update.js +1 -2
- package/tools/watch.js +132 -112
- package/tools/who.js +20 -40
- package/tools/{_deprecated/wordassociation.js → wordassociation.js} +23 -20
- package/tools/workshop-buddy.js +52 -53
- package/tools/x-mentions.js +0 -1
- package/tools/x-reply.js +0 -1
- package/twitter.js +14 -20
- package/version.json +8 -10
- package/webhook-runner.js +132 -0
- package/auth-store.js +0 -148
- package/bridges/bridge-monitor.js +0 -388
- package/bridges/discord-bot.js +0 -431
- package/bridges/farcaster.js +0 -299
- package/bridges/telegram.js +0 -261
- package/bridges/webhook-health.js +0 -420
- package/bridges/webhook-server.js +0 -437
- package/bridges/whatsapp.js +0 -441
- package/bridges/x-webhook.js +0 -423
- package/games/arcade.js +0 -406
- package/games/chess.js +0 -451
- package/games/colorguess.js +0 -343
- package/games/crossword-words.js +0 -171
- package/games/crossword.js +0 -461
- package/games/drawing.js +0 -347
- package/games/gameroulette.js +0 -300
- package/games/gamerouter.js +0 -336
- package/games/gamestatus.js +0 -337
- package/games/guessnumber.js +0 -209
- package/games/hangman.js +0 -279
- package/games/memory.js +0 -338
- package/games/multiplayer-tictactoe.js +0 -389
- package/games/pixelart.js +0 -399
- package/games/quickduel.js +0 -354
- package/games/riddle.js +0 -371
- package/games/rockpaperscissors.js +0 -291
- package/games/snake.js +0 -406
- package/games/storybuilder.js +0 -343
- package/games/tictactoe.js +0 -345
- package/games/twentyquestions.js +0 -286
- package/games/twotruths.js +0 -207
- package/games/werewolf.js +0 -508
- package/games/wordassociation.js +0 -247
- package/games/wordchain.js +0 -135
- package/intelligence/interests.js +0 -369
- package/setup.js +0 -480
- package/smart-inbox.js +0 -276
- package/tools/_deprecated/auto-suggest-connections.js +0 -304
- package/tools/_deprecated/bootstrap-skills.js +0 -231
- package/tools/_deprecated/bridge-dashboard.js +0 -342
- package/tools/_deprecated/bridge-health.js +0 -400
- package/tools/_deprecated/bridge-live.js +0 -384
- package/tools/_deprecated/bridges.js +0 -383
- package/tools/_deprecated/colorguess.js +0 -281
- package/tools/_deprecated/discover-insights.js +0 -379
- package/tools/_deprecated/discover-momentum.js +0 -256
- package/tools/_deprecated/discovery-analytics.js +0 -345
- package/tools/_deprecated/discovery-auto-suggest.js +0 -275
- package/tools/_deprecated/discovery-bootstrap.js +0 -267
- package/tools/_deprecated/discovery-daily.js +0 -375
- package/tools/_deprecated/discovery-dashboard.js +0 -385
- package/tools/_deprecated/discovery-digest.js +0 -314
- package/tools/_deprecated/discovery-hub.js +0 -357
- package/tools/_deprecated/discovery-insights.js +0 -384
- package/tools/_deprecated/discovery-momentum.js +0 -281
- package/tools/_deprecated/discovery-monitor.js +0 -319
- package/tools/_deprecated/discovery-proactive.js +0 -300
- package/tools/_deprecated/draw.js +0 -317
- package/tools/_deprecated/farcaster.js +0 -307
- package/tools/_deprecated/games-catalog.js +0 -376
- package/tools/_deprecated/games.js +0 -313
- package/tools/_deprecated/guessnumber.js +0 -194
- package/tools/_deprecated/hangman.js +0 -129
- package/tools/_deprecated/multiplayer-tictactoe.js +0 -303
- package/tools/_deprecated/riddle.js +0 -240
- package/tools/_deprecated/run-bootstrap.js +0 -69
- package/tools/_deprecated/skills-analytics.js +0 -349
- package/tools/_deprecated/skills-bootstrap.js +0 -301
- package/tools/_deprecated/skills-dashboard.js +0 -268
- package/tools/_deprecated/skills.js +0 -380
- package/tools/_deprecated/smart-intro.js +0 -353
- package/tools/_deprecated/storybuilder.js +0 -331
- package/tools/_deprecated/telegram-bot.js +0 -183
- package/tools/_deprecated/telegram-setup.js +0 -214
- package/tools/_deprecated/twentyquestions.js +0 -143
- package/tools/_shared.js +0 -234
- package/tools/_work-context.js +0 -338
- package/tools/_work-context.manual-test.js +0 -199
- package/tools/_work-context.test.js +0 -260
- package/tools/activity.js +0 -220
- package/tools/agent-treasury.js +0 -288
- package/tools/analytics.js +0 -191
- package/tools/approve.js +0 -197
- package/tools/arcade.js +0 -173
- package/tools/artifacts-price.js +0 -107
- package/tools/ask-expert.js +0 -160
- package/tools/available.js +0 -120
- package/tools/become-expert.js +0 -150
- package/tools/broadcast.js +0 -325
- package/tools/chat.js +0 -202
- package/tools/collaborative-drawing.js +0 -286
- package/tools/connection-status.js +0 -178
- package/tools/earnings.js +0 -126
- package/tools/friends.js +0 -207
- package/tools/genesis.js +0 -233
- package/tools/gig-browse.js +0 -206
- package/tools/gig-complete.js +0 -144
- package/tools/health.js +0 -87
- package/tools/leaderboard.js +0 -117
- package/tools/lib/git-apply.js +0 -206
- package/tools/lib/git-bundle.js +0 -407
- package/tools/mint.js +0 -377
- package/tools/plan.js +0 -225
- package/tools/profile.js +0 -219
- package/tools/proof-of-work.js +0 -144
- package/tools/pulse.js +0 -218
- package/tools/reply.js +0 -166
- package/tools/reputation.js +0 -175
- package/tools/schedule.js +0 -367
- package/tools/search-messages.js +0 -123
- package/tools/session.js +0 -467
- package/tools/session_price.js +0 -128
- package/tools/smart-check.js +0 -201
- package/tools/social-processor.js +0 -445
- package/tools/streak.js +0 -147
- package/tools/stuck.js +0 -297
- package/tools/subscribe.js +0 -148
- package/tools/subscriptions.js +0 -134
- package/tools/tip.js +0 -193
- package/tools/wallet.js +0 -269
- package/tools/webhook-test.js +0 -388
- package/tools/withdraw.js +0 -145
- package/tools/work-summary.js +0 -96
- package/tools/workshop.js +0 -327
- /package/tools/{l2-bridge.js → _experimental/l2-bridge.js} +0 -0
- /package/tools/{l2.js → _experimental/l2.js} +0 -0
- /package/tools/{_deprecated/away.js → away.js} +0 -0
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* /vibe Social Events Processor
|
|
3
|
-
*
|
|
4
|
-
* Processes social media events from all platforms (X, Telegram, Discord)
|
|
5
|
-
* and executes actions based on content analysis.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const config = require('../config');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Social action patterns and responses
|
|
12
|
-
*/
|
|
13
|
-
const SOCIAL_PATTERNS = {
|
|
14
|
-
// /vibe commands
|
|
15
|
-
commands: {
|
|
16
|
-
'join vibe': 'invite_to_vibe',
|
|
17
|
-
'what is vibe': 'explain_vibe',
|
|
18
|
-
'how to join': 'send_invite_link',
|
|
19
|
-
'vibe invite': 'send_invite_link',
|
|
20
|
-
'ship update': 'ask_for_ship_details'
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
// Intent detection
|
|
24
|
-
intents: {
|
|
25
|
-
building: ['building', 'coding', 'developing', 'working on', 'shipping'],
|
|
26
|
-
learning: ['learning', 'studying', 'tutorial', 'how to', 'need help'],
|
|
27
|
-
collaboration: ['collaborate', 'pair program', 'work together', 'team up'],
|
|
28
|
-
feedback: ['feedback', 'review', 'thoughts on', 'what do you think'],
|
|
29
|
-
sharing: ['check this out', 'built this', 'shipped', 'just made']
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
// Auto-response triggers
|
|
33
|
-
triggers: {
|
|
34
|
-
mention_with_question: /(@\w+.*\?)|(\?.*@\w+)/,
|
|
35
|
-
product_hunt_launch: /(product hunt)|(launching on ph)|(ph launch)/i,
|
|
36
|
-
github_share: /github\.com\/[\w-]+\/[\w-]+/,
|
|
37
|
-
demo_share: /(demo)|(live demo)|(check out).*https?/i
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Process incoming social event
|
|
43
|
-
*/
|
|
44
|
-
async function processSocialEvent(event) {
|
|
45
|
-
const { platform, type, from, content, metadata } = event;
|
|
46
|
-
|
|
47
|
-
console.log(`[Social] Processing ${type} from @${from.handle} on ${platform}`);
|
|
48
|
-
|
|
49
|
-
const actions = [];
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
// 1. Command detection
|
|
53
|
-
const command = detectCommand(content);
|
|
54
|
-
if (command) {
|
|
55
|
-
actions.push({
|
|
56
|
-
type: 'command',
|
|
57
|
-
action: SOCIAL_PATTERNS.commands[command],
|
|
58
|
-
priority: 'high'
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// 2. Intent analysis
|
|
63
|
-
const intent = analyzeIntent(content);
|
|
64
|
-
if (intent) {
|
|
65
|
-
actions.push({
|
|
66
|
-
type: 'intent',
|
|
67
|
-
intent,
|
|
68
|
-
priority: 'medium'
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// 3. Auto-response triggers
|
|
73
|
-
const trigger = checkTriggers(content);
|
|
74
|
-
if (trigger) {
|
|
75
|
-
actions.push({
|
|
76
|
-
type: 'trigger',
|
|
77
|
-
trigger,
|
|
78
|
-
priority: 'low'
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// 4. Platform-specific processing
|
|
83
|
-
const platformActions = await processPlatformSpecific(platform, type, event);
|
|
84
|
-
actions.push(...platformActions);
|
|
85
|
-
|
|
86
|
-
// 5. Execute actions
|
|
87
|
-
const results = [];
|
|
88
|
-
for (const action of actions) {
|
|
89
|
-
const result = await executeAction(action, event);
|
|
90
|
-
if (result) results.push(result);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return {
|
|
94
|
-
processed: true,
|
|
95
|
-
actions_taken: results.length,
|
|
96
|
-
actions: results
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
} catch (error) {
|
|
100
|
-
console.error('[Social] Processing error:', error);
|
|
101
|
-
return {
|
|
102
|
-
processed: false,
|
|
103
|
-
error: error.message
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Detect /vibe commands in text
|
|
110
|
-
*/
|
|
111
|
-
function detectCommand(text) {
|
|
112
|
-
const lowerText = text.toLowerCase();
|
|
113
|
-
|
|
114
|
-
for (const [phrase, action] of Object.entries(SOCIAL_PATTERNS.commands)) {
|
|
115
|
-
if (lowerText.includes(phrase)) {
|
|
116
|
-
return phrase;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Analyze user intent from message content
|
|
125
|
-
*/
|
|
126
|
-
function analyzeIntent(text) {
|
|
127
|
-
const lowerText = text.toLowerCase();
|
|
128
|
-
|
|
129
|
-
for (const [intent, keywords] of Object.entries(SOCIAL_PATTERNS.intents)) {
|
|
130
|
-
for (const keyword of keywords) {
|
|
131
|
-
if (lowerText.includes(keyword)) {
|
|
132
|
-
return intent;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Check for auto-response triggers
|
|
142
|
-
*/
|
|
143
|
-
function checkTriggers(text) {
|
|
144
|
-
for (const [trigger, pattern] of Object.entries(SOCIAL_PATTERNS.triggers)) {
|
|
145
|
-
if (pattern.test(text)) {
|
|
146
|
-
return trigger;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return null;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Platform-specific event processing
|
|
155
|
-
*/
|
|
156
|
-
async function processPlatformSpecific(platform, type, event) {
|
|
157
|
-
const actions = [];
|
|
158
|
-
|
|
159
|
-
switch (platform) {
|
|
160
|
-
case 'x':
|
|
161
|
-
if (type === 'mention') {
|
|
162
|
-
actions.push({ type: 'notify_team', platform: 'x', priority: 'medium' });
|
|
163
|
-
|
|
164
|
-
// If mention contains @vibebuilders or #vibe, flag for team attention
|
|
165
|
-
if (event.content.includes('@vibebuilders') || event.content.includes('#vibe')) {
|
|
166
|
-
actions.push({ type: 'team_alert', priority: 'high' });
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (type === 'dm') {
|
|
171
|
-
// Auto-reply to DMs with basic info
|
|
172
|
-
actions.push({ type: 'auto_reply', template: 'dm_welcome', priority: 'high' });
|
|
173
|
-
}
|
|
174
|
-
break;
|
|
175
|
-
|
|
176
|
-
case 'telegram':
|
|
177
|
-
if (type === 'message' && event.metadata?.isGroup) {
|
|
178
|
-
// Group message - log but don't auto-respond
|
|
179
|
-
actions.push({ type: 'log_group_activity', priority: 'low' });
|
|
180
|
-
}
|
|
181
|
-
break;
|
|
182
|
-
|
|
183
|
-
case 'discord':
|
|
184
|
-
if (type === 'slash_command') {
|
|
185
|
-
// Discord commands are handled by the webhook directly
|
|
186
|
-
actions.push({ type: 'log_command_usage', priority: 'low' });
|
|
187
|
-
}
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return actions;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Execute a social action
|
|
196
|
-
*/
|
|
197
|
-
async function executeAction(action, originalEvent) {
|
|
198
|
-
const { type, priority } = action;
|
|
199
|
-
|
|
200
|
-
try {
|
|
201
|
-
switch (type) {
|
|
202
|
-
case 'command':
|
|
203
|
-
return await handleCommand(action.action, originalEvent);
|
|
204
|
-
|
|
205
|
-
case 'intent':
|
|
206
|
-
return await handleIntent(action.intent, originalEvent);
|
|
207
|
-
|
|
208
|
-
case 'auto_reply':
|
|
209
|
-
return await sendAutoReply(action.template, originalEvent);
|
|
210
|
-
|
|
211
|
-
case 'notify_team':
|
|
212
|
-
return await notifyTeam(originalEvent);
|
|
213
|
-
|
|
214
|
-
case 'team_alert':
|
|
215
|
-
return await sendTeamAlert(originalEvent);
|
|
216
|
-
|
|
217
|
-
default:
|
|
218
|
-
console.log(`[Social] Action ${type} logged`);
|
|
219
|
-
return { action: type, status: 'logged' };
|
|
220
|
-
}
|
|
221
|
-
} catch (error) {
|
|
222
|
-
console.error(`[Social] Action ${type} failed:`, error);
|
|
223
|
-
return { action: type, status: 'failed', error: error.message };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Handle /vibe commands
|
|
229
|
-
*/
|
|
230
|
-
async function handleCommand(command, event) {
|
|
231
|
-
const { platform, from } = event;
|
|
232
|
-
|
|
233
|
-
switch (command) {
|
|
234
|
-
case 'invite_to_vibe':
|
|
235
|
-
return await sendVibeInvite(platform, from);
|
|
236
|
-
|
|
237
|
-
case 'explain_vibe':
|
|
238
|
-
return await sendVibeExplanation(platform, from);
|
|
239
|
-
|
|
240
|
-
case 'send_invite_link':
|
|
241
|
-
return await sendInviteLink(platform, from);
|
|
242
|
-
|
|
243
|
-
case 'ask_for_ship_details':
|
|
244
|
-
return await askShipDetails(platform, from);
|
|
245
|
-
|
|
246
|
-
default:
|
|
247
|
-
return { command, status: 'unknown' };
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Handle user intents
|
|
253
|
-
*/
|
|
254
|
-
async function handleIntent(intent, event) {
|
|
255
|
-
const suggestions = {
|
|
256
|
-
building: "That's awesome! Consider sharing your progress in /vibe for feedback and collaboration.",
|
|
257
|
-
learning: "Learning is great! Check out /vibe's workshop resources and connect with other learners.",
|
|
258
|
-
collaboration: "Perfect mindset! /vibe is all about collaborative building. Join us!",
|
|
259
|
-
feedback: "Feedback is valuable! /vibe has active builders who love reviewing each other's work.",
|
|
260
|
-
sharing: "Love the sharing spirit! /vibe is a great place to showcase what you build."
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
return {
|
|
264
|
-
intent,
|
|
265
|
-
suggestion: suggestions[intent] || "Thanks for sharing!",
|
|
266
|
-
status: 'processed'
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Send auto-reply based on template
|
|
272
|
-
*/
|
|
273
|
-
async function sendAutoReply(template, event) {
|
|
274
|
-
const templates = {
|
|
275
|
-
dm_welcome: `Hi! Thanks for reaching out. /vibe is a collaborative workshop where builders ship cool projects together.
|
|
276
|
-
|
|
277
|
-
🚀 Join us: https://slashvibe.dev
|
|
278
|
-
🎮 Try features: Chess, Streaks, Matching
|
|
279
|
-
💬 Connect: @vibebuilders
|
|
280
|
-
|
|
281
|
-
What are you building?`
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
const message = templates[template];
|
|
285
|
-
if (!message) return null;
|
|
286
|
-
|
|
287
|
-
// In a full implementation, this would send the reply via the platform API
|
|
288
|
-
console.log(`[Social] Auto-reply to @${event.from.handle}: ${message.slice(0, 50)}...`);
|
|
289
|
-
|
|
290
|
-
return {
|
|
291
|
-
type: 'auto_reply',
|
|
292
|
-
template,
|
|
293
|
-
recipient: event.from.handle,
|
|
294
|
-
status: 'sent'
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Send /vibe invite
|
|
300
|
-
*/
|
|
301
|
-
async function sendVibeInvite(platform, user) {
|
|
302
|
-
const invite = {
|
|
303
|
-
message: `🎉 You're invited to /vibe!\n\nA collaborative workshop where builders ship together.\n\n🔗 Join: https://slashvibe.dev\n\nSee you in the workshop! 🚀`,
|
|
304
|
-
platform,
|
|
305
|
-
user: user.handle
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
console.log(`[Social] Sent /vibe invite to @${user.handle} on ${platform}`);
|
|
309
|
-
|
|
310
|
-
return {
|
|
311
|
-
type: 'invite',
|
|
312
|
-
recipient: user.handle,
|
|
313
|
-
platform,
|
|
314
|
-
status: 'sent'
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Send /vibe explanation
|
|
320
|
-
*/
|
|
321
|
-
async function sendVibeExplanation(platform, user) {
|
|
322
|
-
const explanation = `✨ /vibe is a collaborative workshop where builders ship cool projects together!
|
|
323
|
-
|
|
324
|
-
🎯 What we do:
|
|
325
|
-
• Build games (Chess, Drawing, Icebreakers)
|
|
326
|
-
• Track progress (Streaks, Achievements)
|
|
327
|
-
• Connect builders (Matching, Skills Exchange)
|
|
328
|
-
• Ship fast (Real-time collaboration)
|
|
329
|
-
|
|
330
|
-
🚀 Join the workshop: https://slashvibe.dev`;
|
|
331
|
-
|
|
332
|
-
console.log(`[Social] Sent /vibe explanation to @${user.handle} on ${platform}`);
|
|
333
|
-
|
|
334
|
-
return {
|
|
335
|
-
type: 'explanation',
|
|
336
|
-
recipient: user.handle,
|
|
337
|
-
platform,
|
|
338
|
-
status: 'sent'
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* Send invite link
|
|
344
|
-
*/
|
|
345
|
-
async function sendInviteLink(platform, user) {
|
|
346
|
-
return {
|
|
347
|
-
type: 'invite_link',
|
|
348
|
-
link: 'https://slashvibe.dev',
|
|
349
|
-
recipient: user.handle,
|
|
350
|
-
platform,
|
|
351
|
-
status: 'sent'
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Ask for ship details
|
|
357
|
-
*/
|
|
358
|
-
async function askShipDetails(platform, user) {
|
|
359
|
-
const response = `🚀 Awesome that you're shipping!
|
|
360
|
-
|
|
361
|
-
What did you build? Tell us about:
|
|
362
|
-
• What it does
|
|
363
|
-
• Tech stack used
|
|
364
|
-
• Any challenges you solved
|
|
365
|
-
|
|
366
|
-
We love celebrating builders in /vibe! 🎉`;
|
|
367
|
-
|
|
368
|
-
return {
|
|
369
|
-
type: 'ship_inquiry',
|
|
370
|
-
message: response,
|
|
371
|
-
recipient: user.handle,
|
|
372
|
-
platform,
|
|
373
|
-
status: 'sent'
|
|
374
|
-
};
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Notify team about social activity
|
|
379
|
-
*/
|
|
380
|
-
async function notifyTeam(event) {
|
|
381
|
-
const notification = {
|
|
382
|
-
type: 'team_notification',
|
|
383
|
-
event_type: event.type,
|
|
384
|
-
platform: event.platform,
|
|
385
|
-
from: event.from.handle,
|
|
386
|
-
content: event.content.slice(0, 100),
|
|
387
|
-
timestamp: new Date().toISOString()
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
console.log('[Social] Team notification:', notification);
|
|
391
|
-
|
|
392
|
-
// In a full implementation, this would send to team channels
|
|
393
|
-
return {
|
|
394
|
-
type: 'team_notification',
|
|
395
|
-
status: 'sent'
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Send high-priority team alert
|
|
401
|
-
*/
|
|
402
|
-
async function sendTeamAlert(event) {
|
|
403
|
-
const alert = {
|
|
404
|
-
type: 'team_alert',
|
|
405
|
-
priority: 'high',
|
|
406
|
-
event_type: event.type,
|
|
407
|
-
platform: event.platform,
|
|
408
|
-
from: event.from.handle,
|
|
409
|
-
content: event.content,
|
|
410
|
-
timestamp: new Date().toISOString(),
|
|
411
|
-
requires_response: true
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
console.log('[Social] HIGH PRIORITY TEAM ALERT:', alert);
|
|
415
|
-
|
|
416
|
-
// In a full implementation, this would ping the team immediately
|
|
417
|
-
return {
|
|
418
|
-
type: 'team_alert',
|
|
419
|
-
priority: 'high',
|
|
420
|
-
status: 'sent'
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Get social activity summary
|
|
426
|
-
*/
|
|
427
|
-
async function getSocialSummary() {
|
|
428
|
-
// This would fetch from KV store in a full implementation
|
|
429
|
-
return {
|
|
430
|
-
platforms_active: ['x', 'telegram', 'discord'],
|
|
431
|
-
events_today: 0, // Would be calculated from KV
|
|
432
|
-
auto_responses_sent: 0,
|
|
433
|
-
team_notifications: 0,
|
|
434
|
-
top_intents: ['building', 'learning', 'collaboration']
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
module.exports = {
|
|
439
|
-
processSocialEvent,
|
|
440
|
-
detectCommand,
|
|
441
|
-
analyzeIntent,
|
|
442
|
-
checkTriggers,
|
|
443
|
-
getSocialSummary,
|
|
444
|
-
SOCIAL_PATTERNS
|
|
445
|
-
};
|
package/tools/streak.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vibe_streak — View and track your building streak
|
|
3
|
-
*
|
|
4
|
-
* Streaks drive retention through daily habit formation.
|
|
5
|
-
*
|
|
6
|
-
* Badge Tiers:
|
|
7
|
-
* - 7 days: Verified Builder
|
|
8
|
-
* - 14 days: Consistent Builder
|
|
9
|
-
* - 30 days: Dedicated Builder
|
|
10
|
-
* - 60 days: Relentless Builder
|
|
11
|
-
* - 100 days: Legendary Builder
|
|
12
|
-
*
|
|
13
|
-
* Streak Freezes:
|
|
14
|
-
* - Earn 1 freeze every 7 days (max 3)
|
|
15
|
-
* - Auto-used if you miss a day
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const config = require('../config');
|
|
19
|
-
|
|
20
|
-
const API_URL = process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
|
|
21
|
-
|
|
22
|
-
const definition = {
|
|
23
|
-
name: 'vibe_streak',
|
|
24
|
-
description: 'View your building streak, badges, and freezes',
|
|
25
|
-
inputSchema: {
|
|
26
|
-
type: 'object',
|
|
27
|
-
properties: {
|
|
28
|
-
user: {
|
|
29
|
-
type: 'string',
|
|
30
|
-
description: 'Username to check (default: yourself)'
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
function requireInit() {
|
|
37
|
-
if (!config.isInitialized()) {
|
|
38
|
-
throw new Error('Not initialized. Run `vibe init` first.');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async function handler(args) {
|
|
43
|
-
requireInit();
|
|
44
|
-
|
|
45
|
-
const myHandle = config.getHandle();
|
|
46
|
-
const targetUser = args.user ? args.user.toLowerCase().replace('@', '') : myHandle;
|
|
47
|
-
const isOwnStreak = targetUser === myHandle.toLowerCase();
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
const endpoint = `${API_URL}/api/growth/streak?user=${targetUser}`;
|
|
51
|
-
const response = await fetch(endpoint);
|
|
52
|
-
const data = await response.json();
|
|
53
|
-
|
|
54
|
-
if (!data.success) {
|
|
55
|
-
return { display: `\u274c Failed to load streak: ${data.error}` };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const streak = data.streak;
|
|
59
|
-
let display = '';
|
|
60
|
-
|
|
61
|
-
// Header with current streak
|
|
62
|
-
if (isOwnStreak) {
|
|
63
|
-
display += `## Your Building Streak\n\n`;
|
|
64
|
-
} else {
|
|
65
|
-
display += `## @${targetUser}'s Building Streak\n\n`;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Big streak number with fire emoji based on length
|
|
69
|
-
const fireEmoji = streak.current >= 30 ? '\ud83d\udd25\ud83d\udd25\ud83d\udd25' :
|
|
70
|
-
streak.current >= 14 ? '\ud83d\udd25\ud83d\udd25' :
|
|
71
|
-
streak.current >= 7 ? '\ud83d\udd25' : '\ud83d\udcaa';
|
|
72
|
-
|
|
73
|
-
display += `### ${fireEmoji} ${streak.current} Day Streak\n\n`;
|
|
74
|
-
|
|
75
|
-
// Status indicators
|
|
76
|
-
if (streak.atRisk) {
|
|
77
|
-
display += `\u26a0\ufe0f **AT RISK** - Ship something today to keep your streak!\n\n`;
|
|
78
|
-
} else if (streak.isActiveToday) {
|
|
79
|
-
display += `\u2705 **Active today** - streak is safe!\n\n`;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Stats
|
|
83
|
-
display += `| Stat | Value |\n`;
|
|
84
|
-
display += `|------|-------|\n`;
|
|
85
|
-
display += `| Current Streak | ${streak.current} days |\n`;
|
|
86
|
-
display += `| Longest Streak | ${streak.longest} days |\n`;
|
|
87
|
-
display += `| Freezes Available | ${data.freezesAvailable}\u2744\ufe0f |\n`;
|
|
88
|
-
display += `| Freezes Used | ${streak.freezesUsed || 0} |\n\n`;
|
|
89
|
-
|
|
90
|
-
// Current tier
|
|
91
|
-
if (streak.tier?.current) {
|
|
92
|
-
display += `### Current Tier: ${streak.tier.current.emoji} ${streak.tier.current.label}\n\n`;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Next badge progress
|
|
96
|
-
if (data.nextBadge) {
|
|
97
|
-
const progress = Math.round((streak.current / data.nextBadge.daysAway + streak.current) * 100);
|
|
98
|
-
display += `### Next Badge: ${data.nextBadge.emoji} ${data.nextBadge.label}\n`;
|
|
99
|
-
display += `**${data.nextBadge.daysAway} days** to unlock\n\n`;
|
|
100
|
-
} else if (streak.current >= 100) {
|
|
101
|
-
display += `### \ud83c\udf1f All badges unlocked! You're a legend.\n\n`;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Earned badges
|
|
105
|
-
if (streak.badges && streak.badges.length > 0) {
|
|
106
|
-
display += `### Earned Badges\n`;
|
|
107
|
-
const badgeInfo = {
|
|
108
|
-
verified_builder: { emoji: '\u2705', label: 'Verified Builder (7d)' },
|
|
109
|
-
consistent_builder: { emoji: '\ud83d\udcaa', label: 'Consistent Builder (14d)' },
|
|
110
|
-
dedicated_builder: { emoji: '\ud83d\udd25', label: 'Dedicated Builder (30d)' },
|
|
111
|
-
relentless_builder: { emoji: '\u26a1', label: 'Relentless Builder (60d)' },
|
|
112
|
-
legendary_builder: { emoji: '\ud83d\udc51', label: 'Legendary Builder (100d)' }
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
for (const badge of streak.badges) {
|
|
116
|
-
const info = badgeInfo[badge] || { emoji: '\ud83c\udfc5', label: badge };
|
|
117
|
-
display += `- ${info.emoji} ${info.label}\n`;
|
|
118
|
-
}
|
|
119
|
-
display += '\n';
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// 30-day calendar visualization
|
|
123
|
-
if (data.calendar) {
|
|
124
|
-
display += `### Last 30 Days\n`;
|
|
125
|
-
display += '`';
|
|
126
|
-
for (const day of data.calendar) {
|
|
127
|
-
display += day.active ? '\u25a0' : '\u25a1';
|
|
128
|
-
}
|
|
129
|
-
display += '`\n';
|
|
130
|
-
display += '_(\u25a0 = active day)_\n';
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Tip for maintaining streak
|
|
134
|
-
if (isOwnStreak && !streak.isActiveToday) {
|
|
135
|
-
display += `\n---\n**Tip:** Ship something or post to the board to record today's activity!`;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return { display };
|
|
139
|
-
|
|
140
|
-
} catch (e) {
|
|
141
|
-
return {
|
|
142
|
-
display: `## Building Streak\n\n\u274c **Failed to load**\n\nError: ${e.message}`
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
module.exports = { definition, handler };
|