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
package/tools/session_price.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vibe_session_price - Set session access type and price
|
|
3
|
-
*
|
|
4
|
-
* Configure how others can access your sessions:
|
|
5
|
-
* - public: Free for all
|
|
6
|
-
* - ppv: Pay-per-view ($1-$50)
|
|
7
|
-
* - subscribers_only: Requires active subscription
|
|
8
|
-
* - private: Creator only
|
|
9
|
-
*
|
|
10
|
-
* Examples:
|
|
11
|
-
* - "set session to ppv $5"
|
|
12
|
-
* - "make my session public"
|
|
13
|
-
* - "set session price to $10"
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
const fetch = require('node-fetch');
|
|
17
|
-
const config = require('../config');
|
|
18
|
-
|
|
19
|
-
const definition = {
|
|
20
|
-
name: 'vibe_session_price',
|
|
21
|
-
description: 'Set session access type and price. Options: public (free), ppv ($1-$50), subscribers_only, private.',
|
|
22
|
-
inputSchema: {
|
|
23
|
-
type: 'object',
|
|
24
|
-
properties: {
|
|
25
|
-
session_id: {
|
|
26
|
-
type: 'string',
|
|
27
|
-
description: 'Session ID to configure (defaults to current session if available)'
|
|
28
|
-
},
|
|
29
|
-
access_type: {
|
|
30
|
-
type: 'string',
|
|
31
|
-
enum: ['public', 'ppv', 'subscribers_only', 'private'],
|
|
32
|
-
description: 'Access type: public (free), ppv (pay-per-view), subscribers_only, private'
|
|
33
|
-
},
|
|
34
|
-
price_dollars: {
|
|
35
|
-
type: 'number',
|
|
36
|
-
description: 'Price in dollars for PPV access (1-50). Required if access_type is ppv.'
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
required: ['access_type']
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
async function handler(args) {
|
|
44
|
-
const { session_id, access_type, price_dollars } = args;
|
|
45
|
-
|
|
46
|
-
if (!config.isInitialized()) {
|
|
47
|
-
return {
|
|
48
|
-
display: 'Run `vibe init` first to set your identity.'
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Validate PPV pricing
|
|
53
|
-
if (access_type === 'ppv') {
|
|
54
|
-
if (!price_dollars || price_dollars < 1 || price_dollars > 50) {
|
|
55
|
-
return {
|
|
56
|
-
display: '❌ PPV access requires a price between $1 and $50'
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const token = config.getToken();
|
|
62
|
-
const apiUrl = process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
const response = await fetch(
|
|
66
|
-
`${apiUrl}/api/sessions/access`,
|
|
67
|
-
{
|
|
68
|
-
method: 'POST',
|
|
69
|
-
headers: {
|
|
70
|
-
'Content-Type': 'application/json',
|
|
71
|
-
'Authorization': `Bearer ${token}`
|
|
72
|
-
},
|
|
73
|
-
body: JSON.stringify({
|
|
74
|
-
session_id: session_id || undefined,
|
|
75
|
-
access_type,
|
|
76
|
-
ppv_price_dollars: price_dollars || undefined
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
const result = await response.json();
|
|
82
|
-
|
|
83
|
-
if (!response.ok) {
|
|
84
|
-
return {
|
|
85
|
-
display: `❌ ${result.error || 'Failed to update session access'}`
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Format success message
|
|
90
|
-
let accessDesc;
|
|
91
|
-
switch (access_type) {
|
|
92
|
-
case 'public':
|
|
93
|
-
accessDesc = '🌐 Public - Free for everyone';
|
|
94
|
-
break;
|
|
95
|
-
case 'ppv':
|
|
96
|
-
accessDesc = `💵 Pay-Per-View - $${price_dollars}`;
|
|
97
|
-
break;
|
|
98
|
-
case 'subscribers_only':
|
|
99
|
-
accessDesc = '⭐ Subscribers Only';
|
|
100
|
-
break;
|
|
101
|
-
case 'private':
|
|
102
|
-
accessDesc = '🔒 Private - Only you';
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
let display = `
|
|
107
|
-
✅ Session Access Updated
|
|
108
|
-
|
|
109
|
-
Session: ${result.session_id}
|
|
110
|
-
Access: ${accessDesc}`;
|
|
111
|
-
|
|
112
|
-
if (access_type === 'ppv') {
|
|
113
|
-
display += `\nPrice: $${price_dollars}`;
|
|
114
|
-
display += '\n\nViewers will need to purchase access to see this session.';
|
|
115
|
-
} else if (access_type === 'subscribers_only') {
|
|
116
|
-
display += '\n\nOnly your subscribers can view this session.';
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return { display: display.trim(), data: result };
|
|
120
|
-
|
|
121
|
-
} catch (error) {
|
|
122
|
-
return {
|
|
123
|
-
display: `❌ Failed to update session access: ${error.message}`
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
module.exports = { definition, handler };
|
package/tools/smart-check.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
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
|
-
};
|