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.
Files changed (102) hide show
  1. package/README.md +173 -0
  2. package/dist/agents/guardrails.d.ts +44 -0
  3. package/dist/agents/guardrails.d.ts.map +1 -0
  4. package/dist/agents/guardrails.js +144 -0
  5. package/dist/agents/guardrails.js.map +1 -0
  6. package/dist/agents/misbehavior-prevention.d.ts +33 -0
  7. package/dist/agents/misbehavior-prevention.d.ts.map +1 -0
  8. package/dist/agents/misbehavior-prevention.js +278 -0
  9. package/dist/agents/misbehavior-prevention.js.map +1 -0
  10. package/dist/chat/handler.d.ts +13 -0
  11. package/dist/chat/handler.d.ts.map +1 -0
  12. package/dist/chat/handler.js +101 -0
  13. package/dist/chat/handler.js.map +1 -0
  14. package/dist/config.d.ts +6 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +66 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +182 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/insights/smart-injection.d.ts +67 -0
  23. package/dist/insights/smart-injection.d.ts.map +1 -0
  24. package/dist/insights/smart-injection.js +257 -0
  25. package/dist/insights/smart-injection.js.map +1 -0
  26. package/dist/legends/character-training.d.ts +36 -0
  27. package/dist/legends/character-training.d.ts.map +1 -0
  28. package/dist/legends/character-training.js +198 -0
  29. package/dist/legends/character-training.js.map +1 -0
  30. package/dist/legends/loader.d.ts +26 -0
  31. package/dist/legends/loader.d.ts.map +1 -0
  32. package/dist/legends/loader.js +104 -0
  33. package/dist/legends/loader.js.map +1 -0
  34. package/dist/legends/personality.d.ts +24 -0
  35. package/dist/legends/personality.d.ts.map +1 -0
  36. package/dist/legends/personality.js +211 -0
  37. package/dist/legends/personality.js.map +1 -0
  38. package/dist/legends/prompt-builder.d.ts +11 -0
  39. package/dist/legends/prompt-builder.d.ts.map +1 -0
  40. package/dist/legends/prompt-builder.js +113 -0
  41. package/dist/legends/prompt-builder.js.map +1 -0
  42. package/dist/tools/chat-with-legend.d.ts +83 -0
  43. package/dist/tools/chat-with-legend.d.ts.map +1 -0
  44. package/dist/tools/chat-with-legend.js +91 -0
  45. package/dist/tools/chat-with-legend.js.map +1 -0
  46. package/dist/tools/get-legend-context.d.ts +64 -0
  47. package/dist/tools/get-legend-context.d.ts.map +1 -0
  48. package/dist/tools/get-legend-context.js +407 -0
  49. package/dist/tools/get-legend-context.js.map +1 -0
  50. package/dist/tools/get-legend-insight.d.ts +33 -0
  51. package/dist/tools/get-legend-insight.d.ts.map +1 -0
  52. package/dist/tools/get-legend-insight.js +209 -0
  53. package/dist/tools/get-legend-insight.js.map +1 -0
  54. package/dist/tools/index.d.ts +103 -0
  55. package/dist/tools/index.d.ts.map +1 -0
  56. package/dist/tools/index.js +17 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/list-legends.d.ts +45 -0
  59. package/dist/tools/list-legends.d.ts.map +1 -0
  60. package/dist/tools/list-legends.js +124 -0
  61. package/dist/tools/list-legends.js.map +1 -0
  62. package/dist/types.d.ts +90 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +3 -0
  65. package/dist/types.js.map +1 -0
  66. package/legends/anatoly-yakovenko/skill.yaml +534 -0
  67. package/legends/andre-cronje/skill.yaml +682 -0
  68. package/legends/andrew-carnegie/skill.yaml +499 -0
  69. package/legends/balaji-srinivasan/skill.yaml +706 -0
  70. package/legends/benjamin-graham/skill.yaml +671 -0
  71. package/legends/bill-gurley/skill.yaml +688 -0
  72. package/legends/brian-armstrong/skill.yaml +640 -0
  73. package/legends/brian-chesky/skill.yaml +692 -0
  74. package/legends/cathie-wood/skill.yaml +522 -0
  75. package/legends/charlie-munger/skill.yaml +694 -0
  76. package/legends/cz-binance/skill.yaml +545 -0
  77. package/legends/demis-hassabis/skill.yaml +762 -0
  78. package/legends/elon-musk/skill.yaml +594 -0
  79. package/legends/gary-vaynerchuk/skill.yaml +586 -0
  80. package/legends/hayden-adams/skill.yaml +591 -0
  81. package/legends/howard-marks/skill.yaml +767 -0
  82. package/legends/jack-dorsey/skill.yaml +568 -0
  83. package/legends/jeff-bezos/skill.yaml +623 -0
  84. package/legends/jensen-huang/skill.yaml +107 -0
  85. package/legends/marc-andreessen/skill.yaml +106 -0
  86. package/legends/mert-mumtaz/skill.yaml +551 -0
  87. package/legends/michael-heinrich/skill.yaml +425 -0
  88. package/legends/naval-ravikant/skill.yaml +575 -0
  89. package/legends/patrick-collison/skill.yaml +779 -0
  90. package/legends/paul-graham/skill.yaml +566 -0
  91. package/legends/peter-thiel/skill.yaml +741 -0
  92. package/legends/ray-dalio/skill.yaml +742 -0
  93. package/legends/reid-hoffman/skill.yaml +107 -0
  94. package/legends/sam-altman/skill.yaml +110 -0
  95. package/legends/satya-nadella/skill.yaml +751 -0
  96. package/legends/steve-jobs/skill.yaml +524 -0
  97. package/legends/sundar-pichai/skill.yaml +523 -0
  98. package/legends/tim-ferriss/skill.yaml +502 -0
  99. package/legends/tobi-lutke/skill.yaml +512 -0
  100. package/legends/vitalik-buterin/skill.yaml +739 -0
  101. package/legends/warren-buffett/skill.yaml +103 -0
  102. package/package.json +69 -0
@@ -0,0 +1,257 @@
1
+ // Smart Insight Injection System
2
+ // Knows WHEN, WHERE, and HOW to recommend legend insights
3
+ import { getLegendById } from '../legends/loader.js';
4
+ /**
5
+ * INSIGHT INJECTION STRATEGY
6
+ *
7
+ * WHERE to inject insights:
8
+ * 1. Topic-triggered: User discusses topic → relevant legend speaks
9
+ * 2. Task-completion: After finishing work → celebratory wisdom
10
+ * 3. Problem-solving: User stuck → mentor perspective
11
+ * 4. Decision points: User choosing options → framework suggestion
12
+ * 5. Learning moments: User asks "how" → pattern/principle injection
13
+ *
14
+ * HOW MANY:
15
+ * - Max 1 insight per conversation turn
16
+ * - Max 3 insights per session (avoid spam)
17
+ * - Cooldown: 5 messages minimum between insights
18
+ * - User can disable with LEGENDS_DISABLE_INSIGHTS=true
19
+ */
20
+ // Topic → Legend mapping for smart recommendations
21
+ export const TOPIC_LEGEND_MAP = {
22
+ // Tech & Engineering
23
+ 'first principles': ['elon-musk'],
24
+ 'physics': ['elon-musk'],
25
+ 'manufacturing': ['elon-musk'],
26
+ 'rockets': ['elon-musk'],
27
+ 'electric vehicles': ['elon-musk'],
28
+ 'scaling': ['elon-musk', 'jeff-bezos'],
29
+ // Product & Design
30
+ 'design': ['steve-jobs'],
31
+ 'product': ['steve-jobs', 'paul-graham'],
32
+ 'simplicity': ['steve-jobs'],
33
+ 'user experience': ['steve-jobs', 'mert-mumtaz'],
34
+ 'ux': ['steve-jobs', 'mert-mumtaz'],
35
+ // Investing & Finance
36
+ 'investing': ['warren-buffett', 'charlie-munger'],
37
+ 'value': ['warren-buffett'],
38
+ 'moat': ['warren-buffett'],
39
+ 'compounding': ['warren-buffett', 'naval-ravikant'],
40
+ 'mental models': ['charlie-munger'],
41
+ // Startups
42
+ 'startup': ['paul-graham', 'sam-altman'],
43
+ 'yc': ['paul-graham', 'sam-altman', 'michael-heinrich'],
44
+ 'y combinator': ['paul-graham', 'sam-altman', 'michael-heinrich'],
45
+ 'fundraising': ['paul-graham', 'marc-andreessen'],
46
+ 'mvp': ['paul-graham'],
47
+ 'launch': ['paul-graham'],
48
+ // Crypto & Web3
49
+ 'crypto': ['cz-binance', 'anatoly-yakovenko'],
50
+ 'blockchain': ['cz-binance', 'anatoly-yakovenko'],
51
+ 'solana': ['anatoly-yakovenko', 'mert-mumtaz'],
52
+ 'exchange': ['cz-binance'],
53
+ 'binance': ['cz-binance'],
54
+ 'rpc': ['mert-mumtaz'],
55
+ 'infrastructure': ['mert-mumtaz', 'michael-heinrich'],
56
+ 'decentralization': ['anatoly-yakovenko', 'michael-heinrich'],
57
+ 'ai infrastructure': ['michael-heinrich'],
58
+ '0g': ['michael-heinrich'],
59
+ // Business & Strategy
60
+ 'network effects': ['reid-hoffman'],
61
+ 'blitzscaling': ['reid-hoffman'],
62
+ 'marketplace': ['reid-hoffman'],
63
+ 'monopoly': ['peter-thiel'],
64
+ 'competition': ['peter-thiel'],
65
+ 'contrarian': ['peter-thiel'],
66
+ 'zero to one': ['peter-thiel'],
67
+ // AI & Technology
68
+ 'ai': ['sam-altman', 'jensen-huang', 'michael-heinrich'],
69
+ 'agi': ['sam-altman'],
70
+ 'gpu': ['jensen-huang'],
71
+ 'nvidia': ['jensen-huang'],
72
+ 'cuda': ['jensen-huang'],
73
+ // Philosophy & Wealth
74
+ 'wealth': ['naval-ravikant'],
75
+ 'leverage': ['naval-ravikant'],
76
+ 'specific knowledge': ['naval-ravikant'],
77
+ 'happiness': ['naval-ravikant'],
78
+ // Developer Experience
79
+ 'developer experience': ['mert-mumtaz'],
80
+ 'dx': ['mert-mumtaz'],
81
+ 'documentation': ['mert-mumtaz'],
82
+ 'docs': ['mert-mumtaz'],
83
+ 'api': ['mert-mumtaz'],
84
+ };
85
+ // Default injection rules
86
+ export const INJECTION_RULES = [
87
+ // High priority - direct topic matches
88
+ {
89
+ context: 'topic_match',
90
+ trigger: /first\s*principles?/i,
91
+ legend_ids: ['elon-musk'],
92
+ priority: 9,
93
+ cooldown_messages: 3,
94
+ },
95
+ {
96
+ context: 'topic_match',
97
+ trigger: /value\s*invest/i,
98
+ legend_ids: ['warren-buffett'],
99
+ priority: 9,
100
+ cooldown_messages: 3,
101
+ },
102
+ {
103
+ context: 'topic_match',
104
+ trigger: /solana|sol\s+(network|blockchain)/i,
105
+ legend_ids: ['anatoly-yakovenko', 'mert-mumtaz'],
106
+ priority: 8,
107
+ cooldown_messages: 3,
108
+ },
109
+ // Medium priority - problem solving
110
+ {
111
+ context: 'problem_solving',
112
+ trigger: ['stuck', 'help', "can't figure out", 'struggling'],
113
+ legend_ids: ['paul-graham', 'charlie-munger'],
114
+ priority: 6,
115
+ cooldown_messages: 5,
116
+ },
117
+ // Decision points
118
+ {
119
+ context: 'decision_point',
120
+ trigger: ['should I', 'which option', 'better approach', 'trade-off'],
121
+ legend_ids: ['charlie-munger', 'jeff-bezos'],
122
+ priority: 7,
123
+ cooldown_messages: 5,
124
+ },
125
+ // Task completion celebration
126
+ {
127
+ context: 'task_complete',
128
+ trigger: ['done', 'finished', 'completed', 'shipped'],
129
+ legend_ids: ['steve-jobs', 'paul-graham'],
130
+ priority: 4,
131
+ cooldown_messages: 10,
132
+ },
133
+ ];
134
+ const sessionStates = new Map();
135
+ const DEFAULT_SESSION_STATE = {
136
+ insightCount: 0,
137
+ messagesSinceLastInsight: 0,
138
+ lastInsightLegend: null,
139
+ disabledUntil: 0,
140
+ };
141
+ // Configuration
142
+ export const INSIGHT_CONFIG = {
143
+ maxInsightsPerSession: 3,
144
+ minMessagesBetweenInsights: 5,
145
+ globalCooldownMs: 60000, // 1 minute minimum between any insights
146
+ enabled: process.env.LEGENDS_DISABLE_INSIGHTS !== 'true',
147
+ };
148
+ /**
149
+ * Detect topics in user message and find relevant legends
150
+ */
151
+ export function detectRelevantLegends(message) {
152
+ const messageLower = message.toLowerCase();
153
+ const relevantLegends = new Set();
154
+ for (const [topic, legends] of Object.entries(TOPIC_LEGEND_MAP)) {
155
+ if (messageLower.includes(topic.toLowerCase())) {
156
+ legends.forEach(l => relevantLegends.add(l));
157
+ }
158
+ }
159
+ return Array.from(relevantLegends);
160
+ }
161
+ /**
162
+ * Check if insight should be injected based on context and rules
163
+ */
164
+ export function shouldInjectInsight(sessionId, message, context) {
165
+ // Check if disabled
166
+ if (!INSIGHT_CONFIG.enabled) {
167
+ return { should: false, reason: 'Insights disabled by config' };
168
+ }
169
+ // Get or create session state
170
+ let state = sessionStates.get(sessionId);
171
+ if (!state) {
172
+ state = { ...DEFAULT_SESSION_STATE };
173
+ sessionStates.set(sessionId, state);
174
+ }
175
+ // Check session limits
176
+ if (state.insightCount >= INSIGHT_CONFIG.maxInsightsPerSession) {
177
+ return { should: false, reason: 'Max insights per session reached' };
178
+ }
179
+ // Check message cooldown
180
+ if (state.messagesSinceLastInsight < INSIGHT_CONFIG.minMessagesBetweenInsights) {
181
+ state.messagesSinceLastInsight++;
182
+ return { should: false, reason: 'Cooldown period active' };
183
+ }
184
+ // Check global cooldown
185
+ if (Date.now() < state.disabledUntil) {
186
+ return { should: false, reason: 'Global cooldown active' };
187
+ }
188
+ // Find matching rules
189
+ const messageLower = message.toLowerCase();
190
+ let bestMatch = null;
191
+ for (const rule of INJECTION_RULES) {
192
+ if (context && rule.context !== context)
193
+ continue;
194
+ let matches = false;
195
+ if (rule.trigger instanceof RegExp) {
196
+ matches = rule.trigger.test(message);
197
+ }
198
+ else {
199
+ matches = rule.trigger.some(t => messageLower.includes(t.toLowerCase()));
200
+ }
201
+ if (matches) {
202
+ // Pick a legend that isn't the last one used
203
+ const availableLegends = rule.legend_ids.filter(l => l !== state.lastInsightLegend);
204
+ const legendId = availableLegends[0] || rule.legend_ids[0];
205
+ if (!bestMatch || rule.priority > bestMatch.rule.priority) {
206
+ bestMatch = { rule, legendId };
207
+ }
208
+ }
209
+ }
210
+ if (bestMatch) {
211
+ // Update state
212
+ state.insightCount++;
213
+ state.messagesSinceLastInsight = 0;
214
+ state.lastInsightLegend = bestMatch.legendId;
215
+ state.disabledUntil = Date.now() + INSIGHT_CONFIG.globalCooldownMs;
216
+ return {
217
+ should: true,
218
+ legendId: bestMatch.legendId,
219
+ reason: `Matched rule: ${bestMatch.rule.context}`,
220
+ };
221
+ }
222
+ // Increment message counter even if no insight
223
+ state.messagesSinceLastInsight++;
224
+ return { should: false, reason: 'No matching rules' };
225
+ }
226
+ /**
227
+ * Get a recommended insight for the current context
228
+ */
229
+ export function getRecommendedInsight(sessionId, message) {
230
+ const check = shouldInjectInsight(sessionId, message);
231
+ if (!check.should || !check.legendId) {
232
+ return null;
233
+ }
234
+ const legend = getLegendById(check.legendId);
235
+ if (!legend)
236
+ return null;
237
+ // Import the insight generator
238
+ // Note: This would be imported from get-legend-insight.ts
239
+ // For now, return a simple format
240
+ return {
241
+ insight: `💡 **${legend.name}** might have wisdom on this topic. Try: \`get_legend_insight legend_id="${check.legendId}"\``,
242
+ legendId: check.legendId,
243
+ };
244
+ }
245
+ /**
246
+ * Reset session state (for testing or new conversations)
247
+ */
248
+ export function resetSession(sessionId) {
249
+ sessionStates.delete(sessionId);
250
+ }
251
+ /**
252
+ * Get session stats (for debugging)
253
+ */
254
+ export function getSessionStats(sessionId) {
255
+ return sessionStates.get(sessionId) || DEFAULT_SESSION_STATE;
256
+ }
257
+ //# sourceMappingURL=smart-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-injection.js","sourceRoot":"","sources":["../../src/insights/smart-injection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * THE SECRET SAUCE:
3
+ *
4
+ * 1. REAL QUOTES - Use their actual words, not paraphrases
5
+ * 2. SPEAKING PATTERNS - How they structure sentences
6
+ * 3. THOUGHT PROCESS - How they reason through problems
7
+ * 4. SIGNATURE MOVES - Things only THEY would say
8
+ * 5. ANTI-PATTERNS - Things they would NEVER say
9
+ *
10
+ * The more specific and grounded in reality, the better.
11
+ */
12
+ export interface CharacterTraining {
13
+ realQuotes: string[];
14
+ thinkingPatterns: string[];
15
+ sentencePatterns: string[];
16
+ obsessions: string[];
17
+ disagreementStyle: string;
18
+ admissionStyle: string;
19
+ }
20
+ export declare const ELON_TRAINING: CharacterTraining;
21
+ export declare const BUFFETT_TRAINING: CharacterTraining;
22
+ export declare const CZ_TRAINING: CharacterTraining;
23
+ /**
24
+ * Build a character-grounded system prompt injection
25
+ * This makes the legend sound MORE authentic
26
+ */
27
+ export declare function buildCharacterInjection(legendId: string): string;
28
+ /**
29
+ * Validate a response sounds in-character
30
+ * Returns confidence score 0-1
31
+ */
32
+ export declare function validateCharacterConsistency(legendId: string, response: string): {
33
+ score: number;
34
+ issues: string[];
35
+ };
36
+ //# sourceMappingURL=character-training.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character-training.d.ts","sourceRoot":"","sources":["../../src/legends/character-training.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,iBAAiB;IAEhC,UAAU,EAAE,MAAM,EAAE,CAAC;IAGrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAG3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAG3B,UAAU,EAAE,MAAM,EAAE,CAAC;IAGrB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAGD,eAAO,MAAM,aAAa,EAAE,iBA0C3B,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,iBA0C9B,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,iBAyCzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA0BhE;AAUD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2CrC"}
@@ -0,0 +1,198 @@
1
+ // Character Training System
2
+ // Makes legends sound AUTHENTIC, not generic AI
3
+ // ELON MUSK - Based on actual interviews, tweets, books
4
+ export const ELON_TRAINING = {
5
+ realQuotes: [
6
+ "I think it's important to reason from first principles rather than by analogy.",
7
+ "The first step is to establish that something is possible; then probability will occur.",
8
+ "If you're not failing, you're not innovating enough.",
9
+ "I'd rather be optimistic and wrong than pessimistic and right.",
10
+ "The best part is no part. The best process is no process.",
11
+ "Failure is an option here. If things are not failing, you are not innovating enough.",
12
+ "When Henry Ford made cheap, reliable cars, people said, 'Nah, what's wrong with a horse?'",
13
+ "I think that's the single best piece of advice: constantly think about how you could be doing things better.",
14
+ ],
15
+ thinkingPatterns: [
16
+ "Boil down to first principles",
17
+ "Ask 'what does physics allow?'",
18
+ "Question every requirement",
19
+ "Delete unnecessary steps",
20
+ "Calculate from raw materials",
21
+ "Think in probabilities, not certainties",
22
+ ],
23
+ sentencePatterns: [
24
+ "The thing is...",
25
+ "If physics allows it...",
26
+ "The idiot index on that is...",
27
+ "Let me put it this way...",
28
+ "The fundamental issue is...",
29
+ "Here's the thing though...",
30
+ ],
31
+ obsessions: [
32
+ "First principles",
33
+ "Physics constraints",
34
+ "Manufacturing efficiency",
35
+ "Cost reduction",
36
+ "Deleting steps",
37
+ "Vertical integration",
38
+ "Aggressive timelines",
39
+ ],
40
+ disagreementStyle: "I respectfully disagree. Here's why physics says otherwise...",
41
+ admissionStyle: "We definitely messed that up. We learned [specific lesson]. Now we do [new approach].",
42
+ };
43
+ // WARREN BUFFETT - Based on shareholder letters, interviews
44
+ export const BUFFETT_TRAINING = {
45
+ realQuotes: [
46
+ "Price is what you pay, value is what you get.",
47
+ "Be fearful when others are greedy and greedy when others are fearful.",
48
+ "Risk comes from not knowing what you're doing.",
49
+ "It's far better to buy a wonderful company at a fair price than a fair company at a wonderful price.",
50
+ "Only when the tide goes out do you discover who's been swimming naked.",
51
+ "The stock market is designed to transfer money from the Active to the Patient.",
52
+ "I never attempt to make money on the stock market. I buy on the assumption that they could close the market the next day.",
53
+ "Time is the friend of the wonderful company, the enemy of the mediocre.",
54
+ ],
55
+ thinkingPatterns: [
56
+ "What's the intrinsic value?",
57
+ "What's my margin of safety?",
58
+ "Would I buy the whole company?",
59
+ "Can I understand this business?",
60
+ "What's the competitive moat?",
61
+ "Think in decades, not quarters",
62
+ ],
63
+ sentencePatterns: [
64
+ "Well, let me tell you...",
65
+ "Charlie and I have always said...",
66
+ "The way I see it...",
67
+ "Here's a simple example...",
68
+ "If you don't understand the business...",
69
+ "Over the long term...",
70
+ ],
71
+ obsessions: [
72
+ "Intrinsic value",
73
+ "Margin of safety",
74
+ "Competitive moats",
75
+ "Management quality",
76
+ "Long-term thinking",
77
+ "Circle of competence",
78
+ "Avoiding losses",
79
+ ],
80
+ disagreementStyle: "I've never been able to understand that approach. In my experience...",
81
+ admissionStyle: "That was a mistake. A really dumb one. I should have known better because...",
82
+ };
83
+ // CZ - Based on tweets, AMAs, interviews
84
+ export const CZ_TRAINING = {
85
+ realQuotes: [
86
+ "4",
87
+ "Funds are SAFU.",
88
+ "Ignore FUD, focus on building.",
89
+ "Stay humble.",
90
+ "Users come first.",
91
+ "Build during the bear market.",
92
+ "We don't comment on rumors.",
93
+ "Keep building. Ignore the noise.",
94
+ ],
95
+ thinkingPatterns: [
96
+ "What's best for users?",
97
+ "Think globally, act locally",
98
+ "Move fast, be flexible",
99
+ "Transparency builds trust",
100
+ "Community over company",
101
+ "Long-term over short-term",
102
+ ],
103
+ sentencePatterns: [
104
+ "4",
105
+ "Simple answer:",
106
+ "Let me be clear:",
107
+ "From a global perspective...",
108
+ "Users first, always.",
109
+ "We're building for the long term.",
110
+ ],
111
+ obsessions: [
112
+ "Global expansion",
113
+ "User protection",
114
+ "SAFU fund",
115
+ "Regulatory compliance",
116
+ "Community building",
117
+ "24/7 operations",
118
+ ],
119
+ disagreementStyle: "4. (I understand, but let me explain our perspective...)",
120
+ admissionStyle: "We made a mistake. We've addressed it. Here's what we changed...",
121
+ };
122
+ /**
123
+ * Build a character-grounded system prompt injection
124
+ * This makes the legend sound MORE authentic
125
+ */
126
+ export function buildCharacterInjection(legendId) {
127
+ const training = CHARACTER_TRAININGS[legendId];
128
+ if (!training)
129
+ return '';
130
+ const injection = `
131
+ ## Speaking Authentically
132
+
133
+ When responding, naturally incorporate:
134
+
135
+ **Your Actual Words:**
136
+ ${training.realQuotes.slice(0, 3).map(q => `- "${q}"`).join('\n')}
137
+
138
+ **How You Think:**
139
+ ${training.thinkingPatterns.slice(0, 3).map(p => `- ${p}`).join('\n')}
140
+
141
+ **Your Speaking Patterns:**
142
+ ${training.sentencePatterns.slice(0, 3).map(s => `- Start with: "${s}"`).join('\n')}
143
+
144
+ **Topics You Care About:**
145
+ ${training.obsessions.join(', ')}
146
+
147
+ **When You Disagree:** ${training.disagreementStyle}
148
+ **When You're Wrong:** ${training.admissionStyle}
149
+ `;
150
+ return injection;
151
+ }
152
+ // Registry of all character trainings
153
+ const CHARACTER_TRAININGS = {
154
+ 'elon-musk': ELON_TRAINING,
155
+ 'warren-buffett': BUFFETT_TRAINING,
156
+ 'cz-binance': CZ_TRAINING,
157
+ // Add more as we develop them
158
+ };
159
+ /**
160
+ * Validate a response sounds in-character
161
+ * Returns confidence score 0-1
162
+ */
163
+ export function validateCharacterConsistency(legendId, response) {
164
+ const training = CHARACTER_TRAININGS[legendId];
165
+ if (!training)
166
+ return { score: 0.7, issues: [] }; // Default if no training
167
+ const issues = [];
168
+ let score = 0.7; // Base score
169
+ // Check for their vocabulary/obsessions
170
+ const obsessionMatches = training.obsessions.filter(o => response.toLowerCase().includes(o.toLowerCase()));
171
+ if (obsessionMatches.length > 0) {
172
+ score += 0.1 * Math.min(obsessionMatches.length / 2, 1);
173
+ }
174
+ // Check for their sentence patterns
175
+ const patternMatches = training.sentencePatterns.filter(p => response.includes(p.replace('...', '')));
176
+ if (patternMatches.length > 0) {
177
+ score += 0.1;
178
+ }
179
+ // Penalize generic AI-speak
180
+ const genericPhrases = [
181
+ "As an AI",
182
+ "I cannot",
183
+ "It's important to note",
184
+ "Based on my training",
185
+ "I don't have personal opinions",
186
+ ];
187
+ for (const phrase of genericPhrases) {
188
+ if (response.includes(phrase)) {
189
+ issues.push(`Generic AI phrase detected: "${phrase}"`);
190
+ score -= 0.15;
191
+ }
192
+ }
193
+ return {
194
+ score: Math.max(0, Math.min(1, score)),
195
+ issues,
196
+ };
197
+ }
198
+ //# sourceMappingURL=character-training.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character-training.js","sourceRoot":"","sources":["../../src/legends/character-training.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { LegendSkill, LegendSummary } from '../types.js';
2
+ /**
3
+ * Load all legends from YAML files
4
+ */
5
+ export declare function loadLegends(): Map<string, LegendSkill>;
6
+ /**
7
+ * Get all legends
8
+ */
9
+ export declare function getAllLegends(): LegendSkill[];
10
+ /**
11
+ * Get a specific legend by ID
12
+ */
13
+ export declare function getLegendById(id: string): LegendSkill | undefined;
14
+ /**
15
+ * Get legend summaries (lightweight list)
16
+ */
17
+ export declare function getLegendSummaries(): LegendSummary[];
18
+ /**
19
+ * Search legends by query
20
+ */
21
+ export declare function searchLegends(query: string): LegendSkill[];
22
+ /**
23
+ * Get legend count
24
+ */
25
+ export declare function getLegendCount(): number;
26
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/legends/loader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA4B9D;;GAEG;AACH,wBAAgB,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAgCtD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,WAAW,EAAE,CAG7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,EAAE,CASpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAU1D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,104 @@
1
+ // Legend loader - loads and caches legend data from bundled YAML files
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import yaml from 'yaml';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ // Cache for loaded legends
9
+ let legendsCache = null;
10
+ /**
11
+ * Get the path to the bundled legends directory
12
+ */
13
+ function getLegendsDir() {
14
+ // In dist/legends/ or ../legends/ relative to the compiled file
15
+ const possiblePaths = [
16
+ path.join(__dirname, '..', '..', 'legends'),
17
+ path.join(__dirname, '..', 'legends'),
18
+ path.join(process.cwd(), 'legends'),
19
+ ];
20
+ for (const p of possiblePaths) {
21
+ if (fs.existsSync(p)) {
22
+ return p;
23
+ }
24
+ }
25
+ throw new Error('Could not find legends directory. Ensure the package is properly installed.');
26
+ }
27
+ /**
28
+ * Load all legends from YAML files
29
+ */
30
+ export function loadLegends() {
31
+ if (legendsCache) {
32
+ return legendsCache;
33
+ }
34
+ const legendsDir = getLegendsDir();
35
+ const legends = new Map();
36
+ const entries = fs.readdirSync(legendsDir, { withFileTypes: true });
37
+ for (const entry of entries) {
38
+ if (!entry.isDirectory())
39
+ continue;
40
+ const skillPath = path.join(legendsDir, entry.name, 'skill.yaml');
41
+ if (!fs.existsSync(skillPath))
42
+ continue;
43
+ try {
44
+ const content = fs.readFileSync(skillPath, 'utf-8');
45
+ const data = yaml.parse(content);
46
+ // Ensure required fields
47
+ if (!data.id)
48
+ data.id = entry.name;
49
+ if (!data.category)
50
+ data.category = 'legends';
51
+ legends.set(data.id, data);
52
+ }
53
+ catch (error) {
54
+ console.error(`[vibey-legends] Error loading ${skillPath}:`, error);
55
+ }
56
+ }
57
+ legendsCache = legends;
58
+ return legends;
59
+ }
60
+ /**
61
+ * Get all legends
62
+ */
63
+ export function getAllLegends() {
64
+ const legends = loadLegends();
65
+ return Array.from(legends.values());
66
+ }
67
+ /**
68
+ * Get a specific legend by ID
69
+ */
70
+ export function getLegendById(id) {
71
+ const legends = loadLegends();
72
+ return legends.get(id);
73
+ }
74
+ /**
75
+ * Get legend summaries (lightweight list)
76
+ */
77
+ export function getLegendSummaries() {
78
+ const legends = getAllLegends();
79
+ return legends.map(l => ({
80
+ id: l.id,
81
+ name: l.name,
82
+ description: l.description,
83
+ expertise: l.owns || [],
84
+ tags: l.tags || [],
85
+ }));
86
+ }
87
+ /**
88
+ * Search legends by query
89
+ */
90
+ export function searchLegends(query) {
91
+ const legends = getAllLegends();
92
+ const q = query.toLowerCase();
93
+ return legends.filter(l => l.name.toLowerCase().includes(q) ||
94
+ l.description.toLowerCase().includes(q) ||
95
+ l.tags?.some(t => t.toLowerCase().includes(q)) ||
96
+ l.owns?.some(o => o.toLowerCase().includes(q)));
97
+ }
98
+ /**
99
+ * Get legend count
100
+ */
101
+ export function getLegendCount() {
102
+ return loadLegends().size;
103
+ }
104
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/legends/loader.ts"],"names":[],"mappings":"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"}