legends-mcp 1.0.0
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 +173 -0
- package/dist/agents/guardrails.d.ts +44 -0
- package/dist/agents/guardrails.d.ts.map +1 -0
- package/dist/agents/guardrails.js +144 -0
- package/dist/agents/guardrails.js.map +1 -0
- package/dist/agents/misbehavior-prevention.d.ts +33 -0
- package/dist/agents/misbehavior-prevention.d.ts.map +1 -0
- package/dist/agents/misbehavior-prevention.js +278 -0
- package/dist/agents/misbehavior-prevention.js.map +1 -0
- package/dist/chat/handler.d.ts +13 -0
- package/dist/chat/handler.d.ts.map +1 -0
- package/dist/chat/handler.js +101 -0
- package/dist/chat/handler.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/insights/smart-injection.d.ts +67 -0
- package/dist/insights/smart-injection.d.ts.map +1 -0
- package/dist/insights/smart-injection.js +257 -0
- package/dist/insights/smart-injection.js.map +1 -0
- package/dist/legends/character-training.d.ts +36 -0
- package/dist/legends/character-training.d.ts.map +1 -0
- package/dist/legends/character-training.js +198 -0
- package/dist/legends/character-training.js.map +1 -0
- package/dist/legends/loader.d.ts +26 -0
- package/dist/legends/loader.d.ts.map +1 -0
- package/dist/legends/loader.js +104 -0
- package/dist/legends/loader.js.map +1 -0
- package/dist/legends/personality.d.ts +24 -0
- package/dist/legends/personality.d.ts.map +1 -0
- package/dist/legends/personality.js +211 -0
- package/dist/legends/personality.js.map +1 -0
- package/dist/legends/prompt-builder.d.ts +11 -0
- package/dist/legends/prompt-builder.d.ts.map +1 -0
- package/dist/legends/prompt-builder.js +113 -0
- package/dist/legends/prompt-builder.js.map +1 -0
- package/dist/tools/chat-with-legend.d.ts +83 -0
- package/dist/tools/chat-with-legend.d.ts.map +1 -0
- package/dist/tools/chat-with-legend.js +91 -0
- package/dist/tools/chat-with-legend.js.map +1 -0
- package/dist/tools/get-legend-context.d.ts +64 -0
- package/dist/tools/get-legend-context.d.ts.map +1 -0
- package/dist/tools/get-legend-context.js +407 -0
- package/dist/tools/get-legend-context.js.map +1 -0
- package/dist/tools/get-legend-insight.d.ts +33 -0
- package/dist/tools/get-legend-insight.d.ts.map +1 -0
- package/dist/tools/get-legend-insight.js +209 -0
- package/dist/tools/get-legend-insight.js.map +1 -0
- package/dist/tools/index.d.ts +103 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-legends.d.ts +45 -0
- package/dist/tools/list-legends.d.ts.map +1 -0
- package/dist/tools/list-legends.js +124 -0
- package/dist/tools/list-legends.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/legends/anatoly-yakovenko/skill.yaml +534 -0
- package/legends/andre-cronje/skill.yaml +682 -0
- package/legends/andrew-carnegie/skill.yaml +499 -0
- package/legends/balaji-srinivasan/skill.yaml +706 -0
- package/legends/benjamin-graham/skill.yaml +671 -0
- package/legends/bill-gurley/skill.yaml +688 -0
- package/legends/brian-armstrong/skill.yaml +640 -0
- package/legends/brian-chesky/skill.yaml +692 -0
- package/legends/cathie-wood/skill.yaml +522 -0
- package/legends/charlie-munger/skill.yaml +694 -0
- package/legends/cz-binance/skill.yaml +545 -0
- package/legends/demis-hassabis/skill.yaml +762 -0
- package/legends/elon-musk/skill.yaml +594 -0
- package/legends/gary-vaynerchuk/skill.yaml +586 -0
- package/legends/hayden-adams/skill.yaml +591 -0
- package/legends/howard-marks/skill.yaml +767 -0
- package/legends/jack-dorsey/skill.yaml +568 -0
- package/legends/jeff-bezos/skill.yaml +623 -0
- package/legends/jensen-huang/skill.yaml +107 -0
- package/legends/marc-andreessen/skill.yaml +106 -0
- package/legends/mert-mumtaz/skill.yaml +551 -0
- package/legends/michael-heinrich/skill.yaml +425 -0
- package/legends/naval-ravikant/skill.yaml +575 -0
- package/legends/patrick-collison/skill.yaml +779 -0
- package/legends/paul-graham/skill.yaml +566 -0
- package/legends/peter-thiel/skill.yaml +741 -0
- package/legends/ray-dalio/skill.yaml +742 -0
- package/legends/reid-hoffman/skill.yaml +107 -0
- package/legends/sam-altman/skill.yaml +110 -0
- package/legends/satya-nadella/skill.yaml +751 -0
- package/legends/steve-jobs/skill.yaml +524 -0
- package/legends/sundar-pichai/skill.yaml +523 -0
- package/legends/tim-ferriss/skill.yaml +502 -0
- package/legends/tobi-lutke/skill.yaml +512 -0
- package/legends/vitalik-buterin/skill.yaml +739 -0
- package/legends/warren-buffett/skill.yaml +103 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misbehavior-prevention.js","sourceRoot":"","sources":["../../src/agents/misbehavior-prevention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Config, ChatMessage, LegendSkill } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Select the appropriate model based on context
|
|
4
|
+
*/
|
|
5
|
+
export declare function selectModel(messages: ChatMessage[], legend: LegendSkill, config: Config): string;
|
|
6
|
+
/**
|
|
7
|
+
* Chat with a legend
|
|
8
|
+
*/
|
|
9
|
+
export declare function chatWithLegend(legend: LegendSkill, userMessage: string, conversationHistory: ChatMessage[], config: Config, context?: string): Promise<{
|
|
10
|
+
content: string;
|
|
11
|
+
model: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/chat/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsBpE;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CAqCR;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,WAAW,EAAE,EAClC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmD7C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Chat handler for OpenRouter/OpenAI API calls
|
|
2
|
+
import OpenAI from 'openai';
|
|
3
|
+
import { buildLegendSystemPrompt } from '../legends/prompt-builder.js';
|
|
4
|
+
let client = null;
|
|
5
|
+
/**
|
|
6
|
+
* Get or create OpenAI client (works with OpenRouter too)
|
|
7
|
+
*/
|
|
8
|
+
function getClient(config) {
|
|
9
|
+
if (!client) {
|
|
10
|
+
client = new OpenAI({
|
|
11
|
+
apiKey: config.apiKey,
|
|
12
|
+
baseURL: config.apiBaseUrl,
|
|
13
|
+
defaultHeaders: {
|
|
14
|
+
'HTTP-Referer': 'https://vibey.dev',
|
|
15
|
+
'X-Title': 'Vibey Legends MCP',
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return client;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Select the appropriate model based on context
|
|
23
|
+
*/
|
|
24
|
+
export function selectModel(messages, legend, config) {
|
|
25
|
+
// Premium legends always use premium model
|
|
26
|
+
const premiumLegends = ['charlie-munger', 'warren-buffett', 'peter-thiel'];
|
|
27
|
+
if (premiumLegends.includes(legend.id)) {
|
|
28
|
+
return config.models.premium;
|
|
29
|
+
}
|
|
30
|
+
// Check message complexity
|
|
31
|
+
const lastMessage = messages[messages.length - 1]?.content || '';
|
|
32
|
+
const complexityKeywords = [
|
|
33
|
+
'explain', 'analyze', 'compare', 'framework', 'first principles',
|
|
34
|
+
'strategy', 'decision', 'evaluate', 'trade-off', 'philosophy'
|
|
35
|
+
];
|
|
36
|
+
const isComplex = messages.length > 4 ||
|
|
37
|
+
lastMessage.length > 400 ||
|
|
38
|
+
complexityKeywords.some(k => lastMessage.toLowerCase().includes(k));
|
|
39
|
+
if (isComplex) {
|
|
40
|
+
return config.models.premium;
|
|
41
|
+
}
|
|
42
|
+
// Use legend's preferred model if specified
|
|
43
|
+
if (legend.model_hints?.preferred) {
|
|
44
|
+
const preferredMap = {
|
|
45
|
+
'claude-sonnet': config.models.premium,
|
|
46
|
+
'claude-opus': config.models.premium,
|
|
47
|
+
'gpt-4o': config.models.balanced,
|
|
48
|
+
'0g-inference': config.models.fast,
|
|
49
|
+
};
|
|
50
|
+
const mapped = preferredMap[legend.model_hints.preferred];
|
|
51
|
+
if (mapped)
|
|
52
|
+
return mapped;
|
|
53
|
+
}
|
|
54
|
+
// Default to balanced
|
|
55
|
+
return config.models.balanced;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Chat with a legend
|
|
59
|
+
*/
|
|
60
|
+
export async function chatWithLegend(legend, userMessage, conversationHistory, config, context) {
|
|
61
|
+
const openai = getClient(config);
|
|
62
|
+
// Build system prompt
|
|
63
|
+
let systemPrompt = buildLegendSystemPrompt(legend);
|
|
64
|
+
// Add context if provided
|
|
65
|
+
if (context) {
|
|
66
|
+
systemPrompt += `\n\n## Current Context\nThe user is working on: ${context}`;
|
|
67
|
+
}
|
|
68
|
+
// Prepare messages
|
|
69
|
+
const messages = [
|
|
70
|
+
{ role: 'system', content: systemPrompt },
|
|
71
|
+
];
|
|
72
|
+
// Add conversation history
|
|
73
|
+
for (const msg of conversationHistory) {
|
|
74
|
+
if (msg.role === 'user' || msg.role === 'assistant') {
|
|
75
|
+
messages.push({ role: msg.role, content: msg.content });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Add current message
|
|
79
|
+
messages.push({ role: 'user', content: userMessage });
|
|
80
|
+
// Select model
|
|
81
|
+
const allMessages = [
|
|
82
|
+
...conversationHistory,
|
|
83
|
+
{ role: 'user', content: userMessage },
|
|
84
|
+
];
|
|
85
|
+
const model = selectModel(allMessages, legend, config);
|
|
86
|
+
// Get temperature from legend hints or defaults
|
|
87
|
+
const temperature = legend.model_hints?.temperature ?? config.defaults.temperature;
|
|
88
|
+
if (config.debug) {
|
|
89
|
+
console.error(`[vibey-legends] Using model: ${model}, temperature: ${temperature}`);
|
|
90
|
+
}
|
|
91
|
+
// Make API call
|
|
92
|
+
const response = await openai.chat.completions.create({
|
|
93
|
+
model,
|
|
94
|
+
messages,
|
|
95
|
+
temperature,
|
|
96
|
+
max_tokens: config.defaults.maxTokens,
|
|
97
|
+
});
|
|
98
|
+
const content = response.choices[0]?.message?.content || '';
|
|
99
|
+
return { content, model };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/chat/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Config } from './types.js';
|
|
2
|
+
export declare function loadConfig(): Config;
|
|
3
|
+
export declare function log(config: Config, ...args: unknown[]): void;
|
|
4
|
+
export declare const LEGAL_DISCLAIMER = "\n---\n**\u26A0\uFE0F IMPORTANT DISCLAIMER**\n\nThis is an AI persona created for **educational and entertainment purposes only**.\n\n- \u274C NOT affiliated with, endorsed by, or representative of the real individual\n- \u274C NOT financial, legal, or professional advice\n- \u274C NOT the actual person - this is an AI simulation\n- \u2705 Based on publicly available information, speeches, and writings\n- \u2705 For learning frameworks and thinking patterns\n- \u2705 Always do your own research (DYOR)\n\n*The views expressed are AI-generated interpretations, not statements from the real person.*\n";
|
|
5
|
+
export declare const SHORT_DISCLAIMER = "*AI persona for education only. Not the real person. Not advice. DYOR.*";
|
|
6
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAgBzC,wBAAgB,UAAU,IAAI,MAAM,CAiCnC;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI5D;AAGD,eAAO,MAAM,gBAAgB,imBAc5B,CAAC;AAGF,eAAO,MAAM,gBAAgB,4EAA4E,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Configuration for Vibey Legends MCP Server
|
|
2
|
+
// Uses OpenRouter with FREE models by default
|
|
3
|
+
// Free models on OpenRouter (no API cost)
|
|
4
|
+
const FREE_MODELS = {
|
|
5
|
+
fast: 'meta-llama/llama-3.2-3b-instruct:free',
|
|
6
|
+
balanced: 'google/gemini-2.0-flash-exp:free',
|
|
7
|
+
premium: 'meta-llama/llama-3.1-70b-instruct:free',
|
|
8
|
+
};
|
|
9
|
+
// Paid models (higher quality, costs money)
|
|
10
|
+
const PAID_MODELS = {
|
|
11
|
+
fast: 'google/gemini-2.0-flash-001',
|
|
12
|
+
balanced: 'anthropic/claude-3.5-haiku',
|
|
13
|
+
premium: 'anthropic/claude-sonnet-4',
|
|
14
|
+
};
|
|
15
|
+
export function loadConfig() {
|
|
16
|
+
const apiKey = process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY;
|
|
17
|
+
if (!apiKey) {
|
|
18
|
+
throw new Error('Missing API key. Set OPENROUTER_API_KEY environment variable.\n' +
|
|
19
|
+
'Get a FREE key at: https://openrouter.ai/keys\n' +
|
|
20
|
+
'Free tier includes unlimited requests to free models!');
|
|
21
|
+
}
|
|
22
|
+
const isOpenRouter = !!process.env.OPENROUTER_API_KEY;
|
|
23
|
+
const useFreeModels = process.env.LEGENDS_USE_FREE_MODELS !== 'false'; // Default to free
|
|
24
|
+
const models = useFreeModels ? FREE_MODELS : PAID_MODELS;
|
|
25
|
+
return {
|
|
26
|
+
apiKey,
|
|
27
|
+
apiBaseUrl: isOpenRouter
|
|
28
|
+
? 'https://openrouter.ai/api/v1'
|
|
29
|
+
: 'https://api.openai.com/v1',
|
|
30
|
+
models: {
|
|
31
|
+
fast: process.env.LEGENDS_MCP_MODEL_FAST || models.fast,
|
|
32
|
+
balanced: process.env.LEGENDS_MCP_MODEL_BALANCED || models.balanced,
|
|
33
|
+
premium: process.env.LEGENDS_MCP_MODEL_PREMIUM || models.premium,
|
|
34
|
+
},
|
|
35
|
+
defaults: {
|
|
36
|
+
temperature: parseFloat(process.env.LEGENDS_MCP_TEMPERATURE || '0.7'),
|
|
37
|
+
maxTokens: parseInt(process.env.LEGENDS_MCP_MAX_TOKENS || '4096', 10),
|
|
38
|
+
},
|
|
39
|
+
debug: process.env.LEGENDS_MCP_DEBUG === 'true',
|
|
40
|
+
useFreeModels,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function log(config, ...args) {
|
|
44
|
+
if (config.debug) {
|
|
45
|
+
console.error('[vibey-legends]', ...args);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Legal disclaimer that MUST appear with every response
|
|
49
|
+
export const LEGAL_DISCLAIMER = `
|
|
50
|
+
---
|
|
51
|
+
**⚠️ IMPORTANT DISCLAIMER**
|
|
52
|
+
|
|
53
|
+
This is an AI persona created for **educational and entertainment purposes only**.
|
|
54
|
+
|
|
55
|
+
- ❌ NOT affiliated with, endorsed by, or representative of the real individual
|
|
56
|
+
- ❌ NOT financial, legal, or professional advice
|
|
57
|
+
- ❌ NOT the actual person - this is an AI simulation
|
|
58
|
+
- ✅ Based on publicly available information, speeches, and writings
|
|
59
|
+
- ✅ For learning frameworks and thinking patterns
|
|
60
|
+
- ✅ Always do your own research (DYOR)
|
|
61
|
+
|
|
62
|
+
*The views expressed are AI-generated interpretations, not statements from the real person.*
|
|
63
|
+
`;
|
|
64
|
+
// Short disclaimer for inline use
|
|
65
|
+
export const SHORT_DISCLAIMER = `*AI persona for education only. Not the real person. Not advice. DYOR.*`;
|
|
66
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,8CAA8C;AAI9C,0CAA0C;AAC1C,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,uCAAuC;IAC7C,QAAQ,EAAE,kCAAkC;IAC5C,OAAO,EAAE,wCAAwC;CAClD,CAAC;AAEF,4CAA4C;AAC5C,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,6BAA6B;IACnC,QAAQ,EAAE,4BAA4B;IACtC,OAAO,EAAE,2BAA2B;CACrC,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE5E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,iEAAiE;YACjE,iDAAiD;YACjD,uDAAuD,CACxD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACtD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,OAAO,CAAC,CAAC,kBAAkB;IAEzF,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;IAEzD,OAAO;QACL,MAAM;QACN,UAAU,EAAE,YAAY;YACtB,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,2BAA2B;QAC/B,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAC,IAAI;YACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,MAAM,CAAC,QAAQ;YACnE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,MAAM,CAAC,OAAO;SACjE;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC;YACrE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,EAAE,EAAE,CAAC;SACtE;QACD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;QAC/C,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,GAAG,IAAe;IACpD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;CAc/B,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,yEAAyE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Vibey Legends MCP Server
|
|
3
|
+
// Chat with AI personas of legendary founders & investors
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { loadConfig, SHORT_DISCLAIMER } from './config.js';
|
|
8
|
+
import { loadLegends, getAllLegends, getLegendById, getLegendCount } from './legends/loader.js';
|
|
9
|
+
import { formatLegendMarkdown } from './legends/prompt-builder.js';
|
|
10
|
+
import { allTools, listLegends, formatLegendsMarkdown, executeChatWithLegend, getLegendContext, getLegendInsight, } from './tools/index.js';
|
|
11
|
+
// Load config and legends at startup
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
const legends = loadLegends();
|
|
14
|
+
console.error(`[vibey-legends] Loaded ${getLegendCount()} legends`);
|
|
15
|
+
console.error(`[vibey-legends] Using API: ${config.apiBaseUrl}`);
|
|
16
|
+
// Create MCP server
|
|
17
|
+
const server = new Server({
|
|
18
|
+
name: 'vibey-legends',
|
|
19
|
+
version: '1.0.0',
|
|
20
|
+
}, {
|
|
21
|
+
capabilities: {
|
|
22
|
+
tools: {},
|
|
23
|
+
resources: {},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
// Handler: List available tools
|
|
27
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
28
|
+
return {
|
|
29
|
+
tools: allTools,
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
// Handler: Call a tool
|
|
33
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
34
|
+
const { name, arguments: args } = request.params;
|
|
35
|
+
try {
|
|
36
|
+
switch (name) {
|
|
37
|
+
case 'list_legends': {
|
|
38
|
+
const result = listLegends(args);
|
|
39
|
+
const markdown = formatLegendsMarkdown(result);
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: 'text',
|
|
44
|
+
text: markdown,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
case 'chat_with_legend': {
|
|
50
|
+
const input = args;
|
|
51
|
+
const legend = getLegendById(input.legend_id);
|
|
52
|
+
if (!legend) {
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: `Error: Legend "${input.legend_id}" not found.\n\nUse list_legends to see available legends.`,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
isError: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const response = await executeChatWithLegend(input, config);
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text: `**${legend.name}:**\n\n${response.content}\n\n---\n*Model: ${response.model_used}*\n\n${SHORT_DISCLAIMER}`,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
case 'get_legend_context': {
|
|
74
|
+
const input = args;
|
|
75
|
+
try {
|
|
76
|
+
const result = getLegendContext({
|
|
77
|
+
legend_id: input.legend_id,
|
|
78
|
+
format: input.format || 'full',
|
|
79
|
+
include_related: input.include_related || false,
|
|
80
|
+
});
|
|
81
|
+
let text = result.content;
|
|
82
|
+
// Add metadata
|
|
83
|
+
text += `\n\n---\n**Metadata:**\n`;
|
|
84
|
+
text += `- Frameworks: ${result.metadata.framework_count}\n`;
|
|
85
|
+
text += `- Principles: ${result.metadata.principle_count}\n`;
|
|
86
|
+
text += `- Examples: ${result.metadata.example_count}\n`;
|
|
87
|
+
if (result.related_legends?.length) {
|
|
88
|
+
text += `\n**Related Legends:**\n`;
|
|
89
|
+
result.related_legends.forEach(r => {
|
|
90
|
+
text += `- ${r.name} (${r.relationship})\n`;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
content: [{ type: 'text', text }],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return {
|
|
99
|
+
content: [
|
|
100
|
+
{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
isError: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
case 'get_legend_insight': {
|
|
110
|
+
const input = args;
|
|
111
|
+
const insightText = getLegendInsight(input);
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: 'text', text: insightText }],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
default:
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
119
|
+
isError: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error(`[vibey-legends] Tool error:`, error);
|
|
125
|
+
return {
|
|
126
|
+
content: [
|
|
127
|
+
{
|
|
128
|
+
type: 'text',
|
|
129
|
+
text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
isError: true,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// Handler: List resources (legends as resources)
|
|
137
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
138
|
+
const legends = getAllLegends();
|
|
139
|
+
return {
|
|
140
|
+
resources: legends.map(legend => ({
|
|
141
|
+
uri: `legend://${legend.id}`,
|
|
142
|
+
name: legend.name,
|
|
143
|
+
description: legend.description,
|
|
144
|
+
mimeType: 'text/markdown',
|
|
145
|
+
})),
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
// Handler: Read a resource
|
|
149
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
150
|
+
const { uri } = request.params;
|
|
151
|
+
// Parse legend:// URI
|
|
152
|
+
const match = uri.match(/^legend:\/\/(.+)$/);
|
|
153
|
+
if (!match) {
|
|
154
|
+
throw new Error(`Invalid URI format: ${uri}`);
|
|
155
|
+
}
|
|
156
|
+
const legendId = match[1];
|
|
157
|
+
const legend = getLegendById(legendId);
|
|
158
|
+
if (!legend) {
|
|
159
|
+
throw new Error(`Legend not found: ${legendId}`);
|
|
160
|
+
}
|
|
161
|
+
const content = formatLegendMarkdown(legend);
|
|
162
|
+
return {
|
|
163
|
+
contents: [
|
|
164
|
+
{
|
|
165
|
+
uri,
|
|
166
|
+
mimeType: 'text/markdown',
|
|
167
|
+
text: content,
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
// Start the server
|
|
173
|
+
async function main() {
|
|
174
|
+
const transport = new StdioServerTransport();
|
|
175
|
+
await server.connect(transport);
|
|
176
|
+
console.error('[vibey-legends] MCP server running on stdio');
|
|
177
|
+
}
|
|
178
|
+
main().catch((error) => {
|
|
179
|
+
console.error('[vibey-legends] Fatal error:', error);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* INSIGHT INJECTION STRATEGY
|
|
3
|
+
*
|
|
4
|
+
* WHERE to inject insights:
|
|
5
|
+
* 1. Topic-triggered: User discusses topic → relevant legend speaks
|
|
6
|
+
* 2. Task-completion: After finishing work → celebratory wisdom
|
|
7
|
+
* 3. Problem-solving: User stuck → mentor perspective
|
|
8
|
+
* 4. Decision points: User choosing options → framework suggestion
|
|
9
|
+
* 5. Learning moments: User asks "how" → pattern/principle injection
|
|
10
|
+
*
|
|
11
|
+
* HOW MANY:
|
|
12
|
+
* - Max 1 insight per conversation turn
|
|
13
|
+
* - Max 3 insights per session (avoid spam)
|
|
14
|
+
* - Cooldown: 5 messages minimum between insights
|
|
15
|
+
* - User can disable with LEGENDS_DISABLE_INSIGHTS=true
|
|
16
|
+
*/
|
|
17
|
+
export declare const TOPIC_LEGEND_MAP: Record<string, string[]>;
|
|
18
|
+
export type InsightContext = 'topic_match' | 'task_complete' | 'problem_solving' | 'decision_point' | 'learning_moment' | 'random_wisdom';
|
|
19
|
+
export interface InsightInjectionRule {
|
|
20
|
+
context: InsightContext;
|
|
21
|
+
trigger: RegExp | string[];
|
|
22
|
+
legend_ids: string[];
|
|
23
|
+
priority: number;
|
|
24
|
+
cooldown_messages: number;
|
|
25
|
+
}
|
|
26
|
+
export declare const INJECTION_RULES: InsightInjectionRule[];
|
|
27
|
+
interface SessionState {
|
|
28
|
+
insightCount: number;
|
|
29
|
+
messagesSinceLastInsight: number;
|
|
30
|
+
lastInsightLegend: string | null;
|
|
31
|
+
disabledUntil: number;
|
|
32
|
+
}
|
|
33
|
+
export declare const INSIGHT_CONFIG: {
|
|
34
|
+
maxInsightsPerSession: number;
|
|
35
|
+
minMessagesBetweenInsights: number;
|
|
36
|
+
globalCooldownMs: number;
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Detect topics in user message and find relevant legends
|
|
41
|
+
*/
|
|
42
|
+
export declare function detectRelevantLegends(message: string): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Check if insight should be injected based on context and rules
|
|
45
|
+
*/
|
|
46
|
+
export declare function shouldInjectInsight(sessionId: string, message: string, context?: InsightContext): {
|
|
47
|
+
should: boolean;
|
|
48
|
+
legendId?: string;
|
|
49
|
+
reason?: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Get a recommended insight for the current context
|
|
53
|
+
*/
|
|
54
|
+
export declare function getRecommendedInsight(sessionId: string, message: string): {
|
|
55
|
+
insight: string;
|
|
56
|
+
legendId: string;
|
|
57
|
+
} | null;
|
|
58
|
+
/**
|
|
59
|
+
* Reset session state (for testing or new conversations)
|
|
60
|
+
*/
|
|
61
|
+
export declare function resetSession(sessionId: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get session stats (for debugging)
|
|
64
|
+
*/
|
|
65
|
+
export declare function getSessionStats(sessionId: string): SessionState;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=smart-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-injection.d.ts","sourceRoot":"","sources":["../../src/insights/smart-injection.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AAGH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAuErD,CAAC;AAGF,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,GACjB,eAAe,CAAC;AAGpB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAGD,eAAO,MAAM,eAAe,EAAE,oBAAoB,EAkDjD,CAAC;AAGF,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB;AAYD,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAwEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiB9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAE/D"}
|