slashvibe-mcp 0.2.9 ā 0.3.13
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/README.md +1 -0
- package/analytics.js +107 -0
- package/auth-store.js +148 -0
- package/auto-update.js +130 -0
- package/bridges/bridge-monitor.js +388 -0
- package/bridges/discord-bot.js +431 -0
- package/bridges/farcaster.js +299 -0
- package/bridges/telegram.js +261 -0
- package/bridges/webhook-health.js +420 -0
- package/bridges/webhook-server.js +437 -0
- package/bridges/whatsapp.js +441 -0
- package/bridges/x-webhook.js +423 -0
- package/config.js +154 -5
- package/crypto.js +3 -8
- package/games/arcade.js +406 -0
- package/games/chess.js +451 -0
- package/games/colorguess.js +343 -0
- package/games/crossword-words.js +171 -0
- package/games/crossword.js +461 -0
- package/games/drawing.js +347 -0
- package/games/gameroulette.js +300 -0
- package/games/gamerouter.js +336 -0
- package/games/gamestatus.js +337 -0
- package/games/guessnumber.js +209 -0
- package/games/hangman.js +279 -0
- package/games/memory.js +338 -0
- package/games/multiplayer-tictactoe.js +389 -0
- package/games/pixelart.js +399 -0
- package/games/quickduel.js +354 -0
- package/games/riddle.js +371 -0
- package/games/rockpaperscissors.js +291 -0
- package/games/snake.js +406 -0
- package/games/storybuilder.js +343 -0
- package/games/tictactoe.js +345 -0
- package/games/twentyquestions.js +286 -0
- package/games/twotruths.js +207 -0
- package/games/werewolf.js +508 -0
- package/games/wordassociation.js +247 -0
- package/games/wordchain.js +135 -0
- package/index.js +105 -216
- package/intelligence/index.js +45 -0
- package/intelligence/infer.js +316 -0
- package/intelligence/interests.js +369 -0
- package/intelligence/patterns.js +651 -0
- package/intelligence/proactive.js +358 -0
- package/intelligence/serendipity.js +306 -0
- package/memory.js +166 -0
- package/notification-emitter.js +77 -0
- package/notify.js +102 -1
- package/package.json +21 -7
- package/prompts.js +1 -1
- package/protocol/index.js +161 -1
- package/setup.js +402 -0
- package/store/api.js +528 -82
- package/store/profiles.js +160 -12
- package/tools/_actions.js +463 -16
- package/tools/_deprecated/auto-suggest-connections.js +304 -0
- package/tools/_deprecated/bootstrap-skills.js +231 -0
- package/tools/_deprecated/bridge-dashboard.js +342 -0
- package/tools/_deprecated/bridge-health.js +400 -0
- package/tools/_deprecated/bridge-live.js +384 -0
- package/tools/_deprecated/bridges.js +383 -0
- package/tools/_deprecated/colorguess.js +281 -0
- package/tools/_deprecated/discover-insights.js +379 -0
- package/tools/_deprecated/discover-momentum.js +256 -0
- package/tools/_deprecated/discovery-analytics.js +345 -0
- package/tools/_deprecated/discovery-auto-suggest.js +275 -0
- package/tools/_deprecated/discovery-bootstrap.js +267 -0
- package/tools/_deprecated/discovery-daily.js +375 -0
- package/tools/_deprecated/discovery-dashboard.js +385 -0
- package/tools/_deprecated/discovery-digest.js +314 -0
- package/tools/_deprecated/discovery-hub.js +357 -0
- package/tools/_deprecated/discovery-insights.js +384 -0
- package/tools/_deprecated/discovery-momentum.js +281 -0
- package/tools/_deprecated/discovery-monitor.js +319 -0
- package/tools/_deprecated/discovery-proactive.js +300 -0
- package/tools/_deprecated/draw.js +317 -0
- package/tools/_deprecated/farcaster.js +307 -0
- package/tools/_deprecated/forget.js +119 -0
- package/tools/_deprecated/games-catalog.js +376 -0
- package/tools/_deprecated/games.js +313 -0
- package/tools/_deprecated/guessnumber.js +194 -0
- package/tools/_deprecated/hangman.js +129 -0
- package/tools/_deprecated/multiplayer-tictactoe.js +303 -0
- package/tools/_deprecated/recall.js +147 -0
- package/tools/_deprecated/remember.js +86 -0
- package/tools/_deprecated/riddle.js +240 -0
- package/tools/_deprecated/run-bootstrap.js +69 -0
- package/tools/_deprecated/skills-analytics.js +349 -0
- package/tools/_deprecated/skills-bootstrap.js +301 -0
- package/tools/_deprecated/skills-dashboard.js +268 -0
- package/tools/_deprecated/skills.js +380 -0
- package/tools/_deprecated/smart-intro.js +353 -0
- package/tools/_deprecated/storybuilder.js +331 -0
- package/tools/_deprecated/telegram-bot.js +183 -0
- package/tools/_deprecated/telegram-setup.js +214 -0
- package/tools/_deprecated/twentyquestions.js +143 -0
- package/tools/_discovery-enhanced.js +290 -0
- package/tools/_discovery.js +439 -0
- package/tools/_proactive-discovery.js +301 -0
- package/tools/_shared/index.js +64 -0
- package/tools/_shared.js +234 -0
- package/tools/_work-context.js +338 -0
- package/tools/_work-context.manual-test.js +199 -0
- package/tools/_work-context.test.js +260 -0
- package/tools/activity.js +220 -0
- package/tools/admin-inbox.js +218 -0
- package/tools/agent-treasury.js +288 -0
- package/tools/analytics.js +191 -0
- package/tools/approve.js +197 -0
- package/tools/arcade.js +173 -0
- package/tools/artifact-create.js +17 -11
- package/tools/artifact-view.js +31 -1
- package/tools/artifacts-price.js +47 -43
- package/tools/ask-expert.js +160 -0
- package/tools/available.js +120 -0
- package/tools/become-expert.js +150 -0
- package/tools/broadcast.js +286 -0
- package/tools/chat.js +202 -0
- package/tools/collaborative-drawing.js +286 -0
- package/tools/connection-status.js +178 -0
- package/tools/crossword.js +17 -1
- package/tools/discover.js +350 -34
- package/tools/dm.js +115 -73
- package/tools/drawing.js +1 -1
- package/tools/earnings.js +126 -0
- package/tools/echo.js +16 -0
- package/tools/feed.js +51 -7
- package/tools/follow.js +224 -0
- package/tools/friends.js +207 -0
- package/tools/game.js +2 -2
- package/tools/genesis.js +233 -0
- package/tools/gig-browse.js +206 -0
- package/tools/gig-complete.js +144 -0
- package/tools/handoff.js +7 -1
- package/tools/help.js +4 -4
- package/tools/idea.js +9 -2
- package/tools/inbox.js +334 -28
- package/tools/init.js +727 -36
- package/tools/invite.js +15 -4
- package/tools/l2-bridge.js +272 -0
- package/tools/l2-status.js +217 -0
- package/tools/l2.js +206 -0
- package/tools/migrate.js +156 -0
- package/tools/mint.js +377 -0
- package/tools/multiplayer-game.js +1 -1
- package/tools/notifications.js +415 -0
- package/tools/observe.js +200 -0
- package/tools/onboarding.js +147 -0
- package/tools/open.js +143 -12
- package/tools/party-game.js +2 -2
- package/tools/plan.js +225 -0
- package/tools/presence-agent.js +7 -0
- package/tools/proof-of-work.js +100 -104
- package/tools/pulse.js +218 -0
- package/tools/reply.js +166 -0
- package/tools/report.js +2 -2
- package/tools/reputation.js +175 -0
- package/tools/request.js +17 -3
- package/tools/schedule.js +367 -0
- package/tools/search-messages.js +123 -0
- package/tools/session.js +420 -0
- package/tools/session_price.js +128 -0
- package/tools/settings.js +126 -3
- package/tools/ship.js +31 -8
- package/tools/shipback.js +326 -0
- package/tools/smart-check.js +201 -0
- package/tools/social-processor.js +445 -0
- package/tools/solo-game.js +1 -1
- package/tools/start.js +335 -93
- package/tools/status.js +53 -6
- package/tools/stuck.js +297 -0
- package/tools/subscribe.js +148 -0
- package/tools/subscriptions.js +134 -0
- package/tools/suggest-tags.js +6 -8
- package/tools/tag-suggestions.js +257 -0
- package/tools/tip.js +193 -0
- package/tools/token.js +103 -0
- package/tools/update.js +1 -1
- package/tools/wallet.js +239 -186
- package/tools/watch.js +157 -0
- package/tools/webhook-test.js +388 -0
- package/tools/who.js +54 -3
- package/tools/withdraw.js +145 -0
- package/tools/work-summary.js +96 -0
- package/tools/workshop.js +327 -0
- package/tools/x-mentions.js +1 -1
- package/version.json +14 -3
- package/tools/artifacts-buy.js +0 -111
- package/tools/connect.js +0 -284
- package/tools/gigs-apply.js +0 -99
- package/tools/gigs-browse.js +0 -114
- package/tools/gigs-complete.js +0 -128
- package/tools/gigs-post.js +0 -140
- package/tools/live-off.js +0 -109
- package/tools/live-watch.js +0 -176
- package/tools/live.js +0 -128
- package/tools/sessions-browse.js +0 -105
- package/tools/whats-happening.js +0 -125
- /package/tools/{away.js ā _deprecated/away.js} +0 -0
- /package/tools/{back.js ā _deprecated/back.js} +0 -0
- /package/tools/{mute.js ā _deprecated/mute.js} +0 -0
- /package/tools/{skills-exchange.js ā _deprecated/skills-exchange.js} +0 -0
- /package/tools/{tictactoe.js ā _deprecated/tictactoe.js} +0 -0
- /package/tools/{wordassociation.js ā _deprecated/wordassociation.js} +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Inbox Check Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for intelligent inbox checking at natural breaks.
|
|
5
|
+
* Designed to be called by Claude Code after commits, tests, builds, or natural pauses.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* vibe check - Explicit check now
|
|
9
|
+
* vibe check --after-commit - Check after a commit
|
|
10
|
+
* vibe check --after-test - Check after test run
|
|
11
|
+
* vibe check --after-build - Check after build
|
|
12
|
+
* vibe check --natural - Check at natural break
|
|
13
|
+
* vibe check --stats - Show check statistics
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const smartInbox = require('../smart-inbox');
|
|
17
|
+
const config = require('../config');
|
|
18
|
+
|
|
19
|
+
const TOOL_NAME = 'vibe_smart_check';
|
|
20
|
+
|
|
21
|
+
const toolDefinition = {
|
|
22
|
+
name: TOOL_NAME,
|
|
23
|
+
description: `Smart inbox check at natural breaks. Call this after commits, tests, builds, or between tasks. Returns unread messages and notifications. Debounced to avoid spam.
|
|
24
|
+
|
|
25
|
+
Example triggers:
|
|
26
|
+
- After git commit: trigger="commit", context={message: "feat: add auth"}
|
|
27
|
+
- After test: trigger="test_pass" or trigger="test_fail"
|
|
28
|
+
- After build: trigger="build_complete" or trigger="build_fail"
|
|
29
|
+
- Natural break: trigger="natural" (between tasks, after file saves)
|
|
30
|
+
- Explicit: trigger="explicit" or omit (check now regardless of timing)
|
|
31
|
+
|
|
32
|
+
The tool debounces checks to avoid notification spam (min 1 minute between checks for same trigger type).`,
|
|
33
|
+
inputSchema: {
|
|
34
|
+
type: 'object',
|
|
35
|
+
properties: {
|
|
36
|
+
trigger: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'What triggered this check',
|
|
39
|
+
enum: ['explicit', 'commit', 'test_pass', 'test_fail', 'build_complete', 'build_fail', 'natural'],
|
|
40
|
+
default: 'explicit',
|
|
41
|
+
},
|
|
42
|
+
context: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
description: 'Optional context about the trigger (commit message, test output, etc.)',
|
|
45
|
+
properties: {
|
|
46
|
+
message: { type: 'string', description: 'Commit message or summary' },
|
|
47
|
+
branch: { type: 'string', description: 'Git branch name' },
|
|
48
|
+
output: { type: 'string', description: 'Test/build output summary' },
|
|
49
|
+
file: { type: 'string', description: 'File being worked on' },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
stats: {
|
|
53
|
+
type: 'boolean',
|
|
54
|
+
description: 'If true, return check statistics instead of checking inbox',
|
|
55
|
+
default: false,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: [],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
async function handler({ trigger = 'explicit', context = {}, stats = false }) {
|
|
63
|
+
// Check initialization
|
|
64
|
+
if (!config.isInitialized()) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text: 'ā Not initialized. Run `vibe init` first.',
|
|
69
|
+
}],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Return stats if requested
|
|
74
|
+
if (stats) {
|
|
75
|
+
const checkStats = smartInbox.getStats();
|
|
76
|
+
const lines = [
|
|
77
|
+
'š **Smart Check Statistics**',
|
|
78
|
+
'',
|
|
79
|
+
`Last check: ${checkStats.lastCheck || 'Never'}`,
|
|
80
|
+
`Last trigger: ${checkStats.lastTrigger || 'None'}`,
|
|
81
|
+
`Total checks: ${checkStats.checkCount}`,
|
|
82
|
+
`Time since last: ${checkStats.timeSinceLastCheck ? `${checkStats.timeSinceLastCheck}s ago` : 'N/A'}`,
|
|
83
|
+
'',
|
|
84
|
+
'**Today\'s triggers:**',
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
const todayTriggers = checkStats.todayTriggers;
|
|
88
|
+
if (Object.keys(todayTriggers).length === 0) {
|
|
89
|
+
lines.push(' (none yet)');
|
|
90
|
+
} else {
|
|
91
|
+
for (const [trig, count] of Object.entries(todayTriggers)) {
|
|
92
|
+
lines.push(` ${trig}: ${count}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
content: [{
|
|
98
|
+
type: 'text',
|
|
99
|
+
text: lines.join('\n'),
|
|
100
|
+
}],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Map trigger strings to constants
|
|
105
|
+
const triggerMap = {
|
|
106
|
+
explicit: smartInbox.TRIGGERS.EXPLICIT,
|
|
107
|
+
commit: smartInbox.TRIGGERS.COMMIT,
|
|
108
|
+
test_pass: smartInbox.TRIGGERS.TEST_PASS,
|
|
109
|
+
test_fail: smartInbox.TRIGGERS.TEST_FAIL,
|
|
110
|
+
build_complete: smartInbox.TRIGGERS.BUILD_COMPLETE,
|
|
111
|
+
build_fail: smartInbox.TRIGGERS.BUILD_FAIL,
|
|
112
|
+
natural: smartInbox.TRIGGERS.NATURAL_BREAK,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const triggerType = triggerMap[trigger] || smartInbox.TRIGGERS.EXPLICIT;
|
|
116
|
+
|
|
117
|
+
// Perform the check
|
|
118
|
+
const result = await smartInbox.check(triggerType, context);
|
|
119
|
+
|
|
120
|
+
// Build response
|
|
121
|
+
if (!result.checked) {
|
|
122
|
+
// Check was debounced or skipped
|
|
123
|
+
const waitSec = Math.ceil((result.waitMs || 0) / 1000);
|
|
124
|
+
return {
|
|
125
|
+
content: [{
|
|
126
|
+
type: 'text',
|
|
127
|
+
text: `ā³ Skipped (${result.reason})${waitSec > 0 ? ` ā try again in ${waitSec}s` : ''}`,
|
|
128
|
+
}],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Format the result
|
|
133
|
+
const lines = [];
|
|
134
|
+
const handle = config.getHandle();
|
|
135
|
+
|
|
136
|
+
// Show what triggered the check
|
|
137
|
+
const triggerEmoji = {
|
|
138
|
+
commit: 'š',
|
|
139
|
+
test_pass: 'ā
',
|
|
140
|
+
test_fail: 'ā',
|
|
141
|
+
build_complete: 'šļø',
|
|
142
|
+
build_fail: 'š“',
|
|
143
|
+
natural_break: 'ā',
|
|
144
|
+
explicit: 'š',
|
|
145
|
+
session_start: 'š',
|
|
146
|
+
session_end: 'š',
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
lines.push(`${triggerEmoji[result.trigger] || 'š¬'} **Inbox check** (${result.trigger})`);
|
|
150
|
+
lines.push('');
|
|
151
|
+
|
|
152
|
+
// Unread messages
|
|
153
|
+
if (result.unreadCount > 0) {
|
|
154
|
+
lines.push(`šØ **${result.unreadCount} unread message${result.unreadCount > 1 ? 's' : ''}**`);
|
|
155
|
+
if (result.notified) {
|
|
156
|
+
lines.push(' ā Notification sent');
|
|
157
|
+
}
|
|
158
|
+
lines.push(` ā Open with \`vibe inbox\``);
|
|
159
|
+
} else {
|
|
160
|
+
lines.push('š No unread messages');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// New users online
|
|
164
|
+
if (result.newOnline && result.newOnline.length > 0) {
|
|
165
|
+
lines.push('');
|
|
166
|
+
lines.push(`š¢ **Just came online:** @${result.newOnline.join(', @')}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// New ships
|
|
170
|
+
if (result.newShips && result.newShips.length > 0) {
|
|
171
|
+
lines.push('');
|
|
172
|
+
lines.push(`š **New ships from connections:** @${result.newShips.join(', @')}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Show context if provided
|
|
176
|
+
if (context.message) {
|
|
177
|
+
lines.push('');
|
|
178
|
+
lines.push(`_Context: "${context.message.slice(0, 60)}${context.message.length > 60 ? '...' : ''}"_`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
content: [{
|
|
183
|
+
type: 'text',
|
|
184
|
+
text: lines.join('\n'),
|
|
185
|
+
}],
|
|
186
|
+
// Include structured data for programmatic use
|
|
187
|
+
_meta: {
|
|
188
|
+
unreadCount: result.unreadCount,
|
|
189
|
+
notified: result.notified,
|
|
190
|
+
newOnline: result.newOnline,
|
|
191
|
+
newShips: result.newShips,
|
|
192
|
+
trigger: result.trigger,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
module.exports = {
|
|
198
|
+
name: TOOL_NAME,
|
|
199
|
+
definition: toolDefinition,
|
|
200
|
+
handler,
|
|
201
|
+
};
|
|
@@ -0,0 +1,445 @@
|
|
|
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/solo-game.js
CHANGED
|
@@ -16,7 +16,7 @@ const memory = require('../games/memory');
|
|
|
16
16
|
|
|
17
17
|
// Post game results to board
|
|
18
18
|
async function postSoloGameResult(player, game, won, score = null) {
|
|
19
|
-
const API_URL = process.env.VIBE_API_URL || 'https://slashvibe.dev';
|
|
19
|
+
const API_URL = process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
|
|
20
20
|
|
|
21
21
|
try {
|
|
22
22
|
let content;
|