bc-code-intelligence-mcp 1.1.1 → 1.2.1

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 (116) hide show
  1. package/README.md +99 -9
  2. package/dist/cli/bc-code-intel-cli.js +0 -1
  3. package/dist/cli/bc-code-intel-cli.js.map +1 -1
  4. package/dist/index.d.ts +12 -4
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +115 -44
  7. package/dist/index.js.map +1 -1
  8. package/dist/layers/embedded-layer.d.ts +74 -0
  9. package/dist/layers/embedded-layer.d.ts.map +1 -1
  10. package/dist/layers/embedded-layer.js +286 -3
  11. package/dist/layers/embedded-layer.js.map +1 -1
  12. package/dist/layers/layer-service.d.ts +6 -0
  13. package/dist/layers/layer-service.d.ts.map +1 -1
  14. package/dist/layers/layer-service.js +13 -0
  15. package/dist/layers/layer-service.js.map +1 -1
  16. package/dist/services/agent-onboarding-service.d.ts +45 -0
  17. package/dist/services/agent-onboarding-service.d.ts.map +1 -0
  18. package/dist/services/agent-onboarding-service.js +372 -0
  19. package/dist/services/agent-onboarding-service.js.map +1 -0
  20. package/dist/services/enhanced-prompt-service.d.ts +56 -0
  21. package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
  22. package/dist/services/enhanced-prompt-service.js +143 -0
  23. package/dist/services/enhanced-prompt-service.js.map +1 -0
  24. package/dist/services/knowledge-service.d.ts +6 -19
  25. package/dist/services/knowledge-service.d.ts.map +1 -1
  26. package/dist/services/knowledge-service.js +73 -129
  27. package/dist/services/knowledge-service.js.map +1 -1
  28. package/dist/services/methodology-service.d.ts.map +1 -1
  29. package/dist/services/methodology-service.js +1 -4
  30. package/dist/services/methodology-service.js.map +1 -1
  31. package/dist/services/multi-content-layer-service.d.ts +92 -0
  32. package/dist/services/multi-content-layer-service.d.ts.map +1 -0
  33. package/dist/services/multi-content-layer-service.js +407 -0
  34. package/dist/services/multi-content-layer-service.js.map +1 -0
  35. package/dist/services/roleplay-engine.d.ts +153 -0
  36. package/dist/services/roleplay-engine.d.ts.map +1 -0
  37. package/dist/services/roleplay-engine.js +862 -0
  38. package/dist/services/roleplay-engine.js.map +1 -0
  39. package/dist/services/session-storage/file-storage.d.ts +30 -0
  40. package/dist/services/session-storage/file-storage.d.ts.map +1 -0
  41. package/dist/services/session-storage/file-storage.js +229 -0
  42. package/dist/services/session-storage/file-storage.js.map +1 -0
  43. package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
  44. package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
  45. package/dist/services/session-storage/in-memory-storage.js +142 -0
  46. package/dist/services/session-storage/in-memory-storage.js.map +1 -0
  47. package/dist/services/specialist-discovery.d.ts +80 -0
  48. package/dist/services/specialist-discovery.d.ts.map +1 -0
  49. package/dist/services/specialist-discovery.js +277 -0
  50. package/dist/services/specialist-discovery.js.map +1 -0
  51. package/dist/services/specialist-handoff-service.d.ts +81 -0
  52. package/dist/services/specialist-handoff-service.d.ts.map +1 -0
  53. package/dist/services/specialist-handoff-service.js +470 -0
  54. package/dist/services/specialist-handoff-service.js.map +1 -0
  55. package/dist/services/specialist-loader.d.ts +101 -0
  56. package/dist/services/specialist-loader.d.ts.map +1 -0
  57. package/dist/services/specialist-loader.js +248 -0
  58. package/dist/services/specialist-loader.js.map +1 -0
  59. package/dist/services/specialist-session-manager.d.ts +76 -0
  60. package/dist/services/specialist-session-manager.d.ts.map +1 -0
  61. package/dist/services/specialist-session-manager.js +255 -0
  62. package/dist/services/specialist-session-manager.js.map +1 -0
  63. package/dist/services/workflow-service.d.ts +9 -3
  64. package/dist/services/workflow-service.d.ts.map +1 -1
  65. package/dist/services/workflow-service.js +95 -13
  66. package/dist/services/workflow-service.js.map +1 -1
  67. package/dist/test-enhanced-mcp-server.js +2 -2
  68. package/dist/test-enhanced-mcp-server.js.map +1 -1
  69. package/dist/tools/specialist-discovery-tools.d.ts +27 -0
  70. package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
  71. package/dist/tools/specialist-discovery-tools.js +287 -0
  72. package/dist/tools/specialist-discovery-tools.js.map +1 -0
  73. package/dist/tools/specialist-tools.d.ts +38 -0
  74. package/dist/tools/specialist-tools.d.ts.map +1 -0
  75. package/dist/tools/specialist-tools.js +322 -0
  76. package/dist/tools/specialist-tools.js.map +1 -0
  77. package/dist/types/config-types.d.ts +2 -0
  78. package/dist/types/config-types.d.ts.map +1 -1
  79. package/dist/types/config-types.js.map +1 -1
  80. package/dist/types/enhanced-layer-types.d.ts +193 -0
  81. package/dist/types/enhanced-layer-types.d.ts.map +1 -0
  82. package/dist/types/enhanced-layer-types.js +9 -0
  83. package/dist/types/enhanced-layer-types.js.map +1 -0
  84. package/dist/types/layer-types.d.ts +2 -0
  85. package/dist/types/layer-types.d.ts.map +1 -1
  86. package/dist/types/layer-types.js.map +1 -1
  87. package/dist/types/roleplay-types.d.ts +155 -0
  88. package/dist/types/roleplay-types.d.ts.map +1 -0
  89. package/dist/types/roleplay-types.js +8 -0
  90. package/dist/types/roleplay-types.js.map +1 -0
  91. package/dist/types/session-types.d.ts +127 -0
  92. package/dist/types/session-types.d.ts.map +1 -0
  93. package/dist/types/session-types.js +8 -0
  94. package/dist/types/session-types.js.map +1 -0
  95. package/embedded-knowledge/AGENTS.md +120 -11
  96. package/embedded-knowledge/README.md +20 -3
  97. package/embedded-knowledge/specialists/alex-architect.md +216 -0
  98. package/embedded-knowledge/specialists/casey-copilot.md +226 -0
  99. package/embedded-knowledge/specialists/chris-config.md +267 -0
  100. package/embedded-knowledge/specialists/dean-debug.md +222 -0
  101. package/embedded-knowledge/specialists/eva-errors.md +235 -0
  102. package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
  103. package/embedded-knowledge/specialists/logan-legacy.md +209 -0
  104. package/embedded-knowledge/specialists/maya-mentor.md +211 -0
  105. package/embedded-knowledge/specialists/morgan-market.md +226 -0
  106. package/embedded-knowledge/specialists/quinn-tester.md +235 -0
  107. package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
  108. package/embedded-knowledge/specialists/sam-coder.md +181 -0
  109. package/embedded-knowledge/specialists/seth-security.md +235 -0
  110. package/embedded-knowledge/specialists/taylor-docs.md +257 -0
  111. package/embedded-knowledge/specialists/uma-ux.md +235 -0
  112. package/package.json +3 -3
  113. package/dist/types/persona-types.d.ts +0 -77
  114. package/dist/types/persona-types.d.ts.map +0 -1
  115. package/dist/types/persona-types.js +0 -341
  116. package/dist/types/persona-types.js.map +0 -1
@@ -0,0 +1,470 @@
1
+ /**
2
+ * Specialist Handoff Service
3
+ *
4
+ * Enables seamless transitions between specialists while preserving context,
5
+ * conversation history, and ensuring natural collaboration flow.
6
+ */
7
+ import { z } from 'zod';
8
+ // Tool argument schemas
9
+ const HandoffToSpecialistArgsSchema = z.object({
10
+ target_specialist_id: z.string().describe('ID of the specialist to hand off to'),
11
+ handoff_type: z.enum(['transfer', 'consultation', 'collaboration', 'escalation']).describe('Type of handoff - transfer (complete), consultation (temporary), collaboration (joint), escalation (senior expert)'),
12
+ handoff_reason: z.string().describe('Clear reason why this handoff is needed'),
13
+ problem_summary: z.string().describe('Current problem/challenge being worked on'),
14
+ work_completed: z.array(z.string()).describe('List of work completed so far'),
15
+ current_challenges: z.array(z.string()).optional().default([]).describe('Current challenges or blockers'),
16
+ continuation_points: z.array(z.string()).optional().default([]).describe('Specific points for the next specialist to focus on'),
17
+ preserve_session: z.boolean().optional().default(true).describe('Whether to preserve current session context')
18
+ });
19
+ const BringInSpecialistArgsSchema = z.object({
20
+ specialist_id: z.string().describe('ID of the specialist to bring in for consultation'),
21
+ consultation_reason: z.string().describe('Why this specialist\'s expertise is needed'),
22
+ specific_question: z.string().describe('Specific question or challenge for the specialist'),
23
+ current_context: z.string().describe('Brief context of current work and situation'),
24
+ collaboration_type: z.enum(['advice', 'review', 'joint-work']).optional().default('advice').describe('Type of collaboration needed')
25
+ });
26
+ const GetHandoffSummaryArgsSchema = z.object({
27
+ session_id: z.string().optional().describe('Session ID to get handoff summary for (current session if omitted)'),
28
+ include_recommendations: z.boolean().optional().default(true).describe('Include previous recommendations in summary')
29
+ });
30
+ export const HANDOFF_TOOLS = [
31
+ {
32
+ name: 'handoff_to_specialist',
33
+ description: `Transfer or collaborate with another BC specialist while preserving full context. Use when:
34
+ • Current problem requires different expertise domain
35
+ • User asks for specific specialist or different perspective
36
+ • Problem complexity requires architectural, security, testing, or other specialized input
37
+ • You've completed your analysis and next steps need different skills
38
+
39
+ Creates seamless transition with full context transfer so user doesn't repeat information.`,
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ target_specialist_id: {
44
+ type: 'string',
45
+ description: 'ID of the specialist to hand off to'
46
+ },
47
+ handoff_type: {
48
+ type: 'string',
49
+ enum: ['transfer', 'consultation', 'collaboration', 'escalation'],
50
+ description: 'Type of handoff - transfer (complete), consultation (temporary), collaboration (joint), escalation (senior expert)'
51
+ },
52
+ handoff_reason: {
53
+ type: 'string',
54
+ description: 'Clear reason why this handoff is needed'
55
+ },
56
+ problem_summary: {
57
+ type: 'string',
58
+ description: 'Current problem/challenge being worked on'
59
+ },
60
+ work_completed: {
61
+ type: 'array',
62
+ items: { type: 'string' },
63
+ description: 'List of work completed so far'
64
+ },
65
+ current_challenges: {
66
+ type: 'array',
67
+ items: { type: 'string' },
68
+ description: 'Current challenges or blockers'
69
+ },
70
+ continuation_points: {
71
+ type: 'array',
72
+ items: { type: 'string' },
73
+ description: 'Specific points for the next specialist to focus on'
74
+ },
75
+ preserve_session: {
76
+ type: 'boolean',
77
+ description: 'Whether to preserve current session context',
78
+ default: true
79
+ }
80
+ },
81
+ required: ['target_specialist_id', 'handoff_type', 'handoff_reason', 'problem_summary', 'work_completed']
82
+ }
83
+ },
84
+ {
85
+ name: 'bring_in_specialist',
86
+ description: `Bring in another specialist for consultation or collaboration while maintaining current session. Use for quick expert input, code reviews, or joint problem-solving without full handoff.`,
87
+ inputSchema: {
88
+ type: 'object',
89
+ properties: {
90
+ specialist_id: {
91
+ type: 'string',
92
+ description: 'ID of the specialist to bring in for consultation'
93
+ },
94
+ consultation_reason: {
95
+ type: 'string',
96
+ description: 'Why this specialist\'s expertise is needed'
97
+ },
98
+ specific_question: {
99
+ type: 'string',
100
+ description: 'Specific question or challenge for the specialist'
101
+ },
102
+ current_context: {
103
+ type: 'string',
104
+ description: 'Brief context of current work and situation'
105
+ },
106
+ collaboration_type: {
107
+ type: 'string',
108
+ enum: ['advice', 'review', 'joint-work'],
109
+ description: 'Type of collaboration needed'
110
+ }
111
+ },
112
+ required: ['specialist_id', 'consultation_reason', 'specific_question', 'current_context']
113
+ }
114
+ },
115
+ {
116
+ name: 'get_handoff_summary',
117
+ description: `Get summary of previous specialist handoffs and context for current session. Useful when you need to understand what other specialists have already worked on.`,
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ session_id: {
122
+ type: 'string',
123
+ description: 'Session ID to get handoff summary for (current session if omitted)'
124
+ },
125
+ include_recommendations: {
126
+ type: 'boolean',
127
+ description: 'Include previous recommendations in summary',
128
+ default: true
129
+ }
130
+ },
131
+ required: []
132
+ }
133
+ }
134
+ ];
135
+ export class SpecialistHandoffService {
136
+ sessionManager;
137
+ discoveryService;
138
+ layerService;
139
+ handoffHistory = new Map();
140
+ currentSessionId; // Track current session
141
+ constructor(sessionManager, discoveryService, layerService) {
142
+ this.sessionManager = sessionManager;
143
+ this.discoveryService = discoveryService;
144
+ this.layerService = layerService;
145
+ }
146
+ /**
147
+ * Set current session ID for handoff operations
148
+ */
149
+ setCurrentSession(sessionId) {
150
+ this.currentSessionId = sessionId;
151
+ }
152
+ /**
153
+ * Get current session
154
+ */
155
+ async getCurrentSession() {
156
+ if (!this.currentSessionId) {
157
+ return null;
158
+ }
159
+ return await this.sessionManager.getSession(this.currentSessionId);
160
+ }
161
+ async handleToolCall(request) {
162
+ try {
163
+ switch (request.params.name) {
164
+ case 'handoff_to_specialist':
165
+ return await this.handoffToSpecialist(request);
166
+ case 'bring_in_specialist':
167
+ return await this.bringInSpecialist(request);
168
+ case 'get_handoff_summary':
169
+ return await this.getHandoffSummary(request);
170
+ default:
171
+ throw new Error(`Unknown tool: ${request.params.name}`);
172
+ }
173
+ }
174
+ catch (error) {
175
+ return {
176
+ content: [
177
+ {
178
+ type: 'text',
179
+ text: `Error in handoff service: ${error instanceof Error ? error.message : String(error)}`
180
+ }
181
+ ],
182
+ isError: true
183
+ };
184
+ }
185
+ }
186
+ /**
187
+ * Execute handoff to another specialist with full context transfer
188
+ */
189
+ async handoffToSpecialist(request) {
190
+ const args = HandoffToSpecialistArgsSchema.parse(request.params.arguments);
191
+ // Get current session context
192
+ const currentSession = await this.getCurrentSession();
193
+ if (!currentSession) {
194
+ return {
195
+ content: [
196
+ {
197
+ type: 'text',
198
+ text: 'No active session found. Start a session first with suggest_specialist.'
199
+ }
200
+ ],
201
+ isError: true
202
+ };
203
+ }
204
+ // Get target specialist info
205
+ const specialists = await this.layerService.getAllSpecialists();
206
+ const targetSpecialist = specialists.find(s => s.specialist_id === args.target_specialist_id);
207
+ if (!targetSpecialist) {
208
+ return {
209
+ content: [
210
+ {
211
+ type: 'text',
212
+ text: `Specialist ${args.target_specialist_id} not found. Use 'browse_specialists' to see available specialists.`
213
+ }
214
+ ],
215
+ isError: true
216
+ };
217
+ }
218
+ // Create handoff context
219
+ const handoffContext = {
220
+ session_id: currentSession.sessionId,
221
+ from_specialist: currentSession.specialistId,
222
+ to_specialist: args.target_specialist_id,
223
+ handoff_type: args.handoff_type,
224
+ problem_summary: args.problem_summary,
225
+ work_completed: args.work_completed,
226
+ recommendations_made: currentSession.context.recommendations || [],
227
+ current_challenges: args.current_challenges,
228
+ user_context: {
229
+ expertise_level: currentSession.context.userPreferences?.expertiseLevel,
230
+ bc_version: undefined, // Not available in current session structure
231
+ project_type: currentSession.context.codebaseContext?.project,
232
+ preferences: currentSession.context.userPreferences?.preferredTopics
233
+ },
234
+ conversation_summary: this.summarizeConversation(currentSession),
235
+ handoff_reason: args.handoff_reason,
236
+ continuation_points: args.continuation_points
237
+ };
238
+ // Store handoff history
239
+ const sessionHandoffs = this.handoffHistory.get(currentSession.sessionId) || [];
240
+ sessionHandoffs.push(handoffContext);
241
+ this.handoffHistory.set(currentSession.sessionId, sessionHandoffs);
242
+ // Create handoff message
243
+ let response = this.createHandoffMessage(handoffContext, targetSpecialist);
244
+ // Handle session transition based on handoff type
245
+ if (args.handoff_type === 'transfer' && args.preserve_session) {
246
+ // Transfer session to new specialist
247
+ await this.sessionManager.transferSession(currentSession.sessionId, args.target_specialist_id);
248
+ response += `\n\n🔄 **Session transferred to ${targetSpecialist.title}**\n`;
249
+ response += `Use \`suggest_specialist ${args.target_specialist_id}\` to continue with full context.`;
250
+ }
251
+ else if (args.handoff_type === 'collaboration') {
252
+ response += `\n\n🤝 **Collaboration Mode**\n`;
253
+ response += `Both specialists are now available for this session. Use \`suggest_specialist ${args.target_specialist_id}\` to engage.`;
254
+ }
255
+ return {
256
+ content: [
257
+ {
258
+ type: 'text',
259
+ text: response
260
+ }
261
+ ]
262
+ };
263
+ }
264
+ /**
265
+ * Bring in specialist for consultation without full handoff
266
+ */
267
+ async bringInSpecialist(request) {
268
+ const args = BringInSpecialistArgsSchema.parse(request.params.arguments);
269
+ const specialists = await this.layerService.getAllSpecialists();
270
+ const specialist = specialists.find(s => s.specialist_id === args.specialist_id);
271
+ if (!specialist) {
272
+ return {
273
+ content: [
274
+ {
275
+ type: 'text',
276
+ text: `Specialist ${args.specialist_id} not found.`
277
+ }
278
+ ],
279
+ isError: true
280
+ };
281
+ }
282
+ const emoji = this.getSpecialistEmoji(args.specialist_id);
283
+ let response = `🤝 **Bringing in ${emoji} ${specialist.title}**\n\n`;
284
+ response += `**Consultation Reason:** ${args.consultation_reason}\n\n`;
285
+ response += `**Current Context:** ${args.current_context}\n\n`;
286
+ response += `**Specific Question:** "${args.specific_question}"\n\n`;
287
+ if (args.collaboration_type === 'advice') {
288
+ response += `💡 **Quick Expert Input Needed**\n`;
289
+ response += `${specialist.title.split(' - ')[0]} can provide immediate guidance on this specific question.`;
290
+ }
291
+ else if (args.collaboration_type === 'review') {
292
+ response += `🔍 **Expert Review Requested**\n`;
293
+ response += `${specialist.title.split(' - ')[0]} will review the current approach and provide feedback.`;
294
+ }
295
+ else if (args.collaboration_type === 'joint-work') {
296
+ response += `🤝 **Joint Problem-Solving**\n`;
297
+ response += `${specialist.title.split(' - ')[0]} will work alongside on this challenge.`;
298
+ }
299
+ response += `\n\n🎯 **To engage:** Use \`suggest_specialist ${args.specialist_id}\` with this context.`;
300
+ return {
301
+ content: [
302
+ {
303
+ type: 'text',
304
+ text: response
305
+ }
306
+ ]
307
+ };
308
+ }
309
+ /**
310
+ * Get handoff summary for current session
311
+ */
312
+ async getHandoffSummary(request) {
313
+ const args = GetHandoffSummaryArgsSchema.parse(request.params.arguments);
314
+ const currentSession = await this.getCurrentSession();
315
+ const sessionId = args.session_id || currentSession?.sessionId;
316
+ if (!sessionId) {
317
+ return {
318
+ content: [
319
+ {
320
+ type: 'text',
321
+ text: 'No active session found.'
322
+ }
323
+ ],
324
+ isError: true
325
+ };
326
+ }
327
+ const handoffs = this.handoffHistory.get(sessionId) || [];
328
+ if (handoffs.length === 0) {
329
+ return {
330
+ content: [
331
+ {
332
+ type: 'text',
333
+ text: 'No handoffs have occurred in this session.'
334
+ }
335
+ ]
336
+ };
337
+ }
338
+ let response = `📋 **Session Handoff Summary**\n\n`;
339
+ handoffs.forEach((handoff, index) => {
340
+ const fromEmoji = this.getSpecialistEmoji(handoff.from_specialist);
341
+ const toEmoji = this.getSpecialistEmoji(handoff.to_specialist);
342
+ response += `**${index + 1}. ${fromEmoji} → ${toEmoji} (${handoff.handoff_type})**\n`;
343
+ response += ` Reason: ${handoff.handoff_reason}\n`;
344
+ response += ` Problem: ${handoff.problem_summary}\n`;
345
+ if (handoff.work_completed.length > 0) {
346
+ response += ` Completed: ${handoff.work_completed.slice(0, 2).join(', ')}${handoff.work_completed.length > 2 ? '...' : ''}\n`;
347
+ }
348
+ if (handoff.continuation_points.length > 0) {
349
+ response += ` Focus: ${handoff.continuation_points.slice(0, 2).join(', ')}\n`;
350
+ }
351
+ response += '\n';
352
+ });
353
+ if (args.include_recommendations && currentSession?.context.recommendations) {
354
+ response += `\n💡 **Current Recommendations:**\n`;
355
+ currentSession.context.recommendations.slice(0, 3).forEach((rec, index) => {
356
+ response += `${index + 1}. ${rec}\n`;
357
+ });
358
+ }
359
+ return {
360
+ content: [
361
+ {
362
+ type: 'text',
363
+ text: response
364
+ }
365
+ ]
366
+ };
367
+ }
368
+ /**
369
+ * Create handoff message with full context
370
+ */
371
+ createHandoffMessage(context, targetSpecialist) {
372
+ const fromEmoji = this.getSpecialistEmoji(context.from_specialist);
373
+ const toEmoji = this.getSpecialistEmoji(context.to_specialist);
374
+ let message = `🔄 **Specialist ${context.handoff_type === 'transfer' ? 'Handoff' : 'Collaboration'}**\n\n`;
375
+ message += `${fromEmoji} **From:** ${this.getSpecialistName(context.from_specialist)}\n`;
376
+ message += `${toEmoji} **To:** ${targetSpecialist.title}\n`;
377
+ message += `🎯 **Type:** ${context.handoff_type}\n\n`;
378
+ message += `**Handoff Reason:** ${context.handoff_reason}\n\n`;
379
+ message += `📋 **Context Summary:**\n`;
380
+ message += `• **Problem:** ${context.problem_summary}\n`;
381
+ if (context.work_completed.length > 0) {
382
+ message += `• **Work Completed:**\n`;
383
+ context.work_completed.forEach((work, index) => {
384
+ message += ` ${index + 1}. ${work}\n`;
385
+ });
386
+ }
387
+ if (context.current_challenges.length > 0) {
388
+ message += `• **Current Challenges:**\n`;
389
+ context.current_challenges.forEach((challenge, index) => {
390
+ message += ` ${index + 1}. ${challenge}\n`;
391
+ });
392
+ }
393
+ if (context.continuation_points.length > 0) {
394
+ message += `• **Focus Areas for ${targetSpecialist.title.split(' - ')[0]}:**\n`;
395
+ context.continuation_points.forEach((point, index) => {
396
+ message += ` ${index + 1}. ${point}\n`;
397
+ });
398
+ }
399
+ if (context.recommendations_made.length > 0) {
400
+ message += `• **Previous Recommendations:**\n`;
401
+ context.recommendations_made.slice(0, 3).forEach((rec, index) => {
402
+ message += ` ${index + 1}. ${rec}\n`;
403
+ });
404
+ }
405
+ message += `\n💬 **Ready for ${targetSpecialist.title.split(' - ')[0]}:** All context has been preserved for seamless continuation.`;
406
+ return message;
407
+ }
408
+ /**
409
+ * Summarize conversation for handoff context
410
+ */
411
+ summarizeConversation(session) {
412
+ // Simple conversation summary - could be enhanced with more sophisticated analysis
413
+ const messages = session.messages || [];
414
+ if (messages.length === 0)
415
+ return 'No conversation history';
416
+ const recentMessages = messages.slice(-5); // Last 5 messages
417
+ return `Recent discussion: ${recentMessages.map(m => m.content).join(' | ')}`;
418
+ }
419
+ /**
420
+ * Get specialist name by ID
421
+ */
422
+ getSpecialistName(specialistId) {
423
+ const nameMap = {
424
+ 'dean-debug': 'Dean Debug',
425
+ 'eva-errors': 'Eva Errors',
426
+ 'alex-architect': 'Alex Architect',
427
+ 'sam-coder': 'Sam Coder',
428
+ 'quinn-tester': 'Quinn Tester',
429
+ 'seth-security': 'Seth Security',
430
+ 'uma-ux': 'Uma UX',
431
+ 'jordan-bridge': 'Jordan Bridge',
432
+ 'logan-legacy': 'Logan Legacy',
433
+ 'roger-reviewer': 'Roger Reviewer',
434
+ 'maya-mentor': 'Maya Mentor',
435
+ 'taylor-docs': 'Taylor Docs',
436
+ 'casey-copilot': 'Casey Copilot',
437
+ 'morgan-market': 'Morgan Market'
438
+ };
439
+ return nameMap[specialistId] || specialistId;
440
+ }
441
+ /**
442
+ * Get emoji for specialist
443
+ */
444
+ getSpecialistEmoji(specialistId) {
445
+ const emojiMap = {
446
+ 'dean-debug': '🔍',
447
+ 'eva-errors': '⚠️',
448
+ 'alex-architect': '🏗️',
449
+ 'sam-coder': '💻',
450
+ 'quinn-tester': '🧪',
451
+ 'seth-security': '🔒',
452
+ 'uma-ux': '🎨',
453
+ 'jordan-bridge': '🌉',
454
+ 'logan-legacy': '🏛️',
455
+ 'roger-reviewer': '📝',
456
+ 'maya-mentor': '👩‍🏫',
457
+ 'taylor-docs': '📚',
458
+ 'casey-copilot': '🤖',
459
+ 'morgan-market': '🏪'
460
+ };
461
+ return emojiMap[specialistId] || '👤';
462
+ }
463
+ /**
464
+ * Get tool definitions for MCP registration
465
+ */
466
+ getToolDefinitions() {
467
+ return HANDOFF_TOOLS;
468
+ }
469
+ }
470
+ //# sourceMappingURL=specialist-handoff-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-handoff-service.js","sourceRoot":"","sources":["../../src/services/specialist-handoff-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Specialist Loader Service
3
+ *
4
+ * Loads and parses specialist persona definitions from markdown files
5
+ * with rich YAML frontmatter including personality traits, collaboration
6
+ * patterns, and roleplay information.
7
+ */
8
+ export interface SpecialistPersona {
9
+ personality: string[];
10
+ communication_style: string;
11
+ greeting: string;
12
+ }
13
+ export interface SpecialistExpertise {
14
+ primary: string[];
15
+ secondary: string[];
16
+ }
17
+ export interface SpecialistCollaboration {
18
+ natural_handoffs: string[];
19
+ team_consultations: string[];
20
+ }
21
+ export interface SpecialistDefinition {
22
+ title: string;
23
+ specialist_id: string;
24
+ emoji: string;
25
+ role: string;
26
+ team: string;
27
+ persona: SpecialistPersona;
28
+ expertise: SpecialistExpertise;
29
+ domains: string[];
30
+ when_to_use: string[];
31
+ collaboration: SpecialistCollaboration;
32
+ related_specialists: string[];
33
+ content: string;
34
+ }
35
+ export interface SpecialistCharacterGuide {
36
+ identity_section: string;
37
+ process_section: string;
38
+ examples_section: string;
39
+ collaboration_section: string;
40
+ }
41
+ export declare class SpecialistLoader {
42
+ private specialistsPath;
43
+ private specialistCache;
44
+ private loaded;
45
+ constructor(specialistsPath: string);
46
+ /**
47
+ * Load all specialist definitions from the specialists folder
48
+ */
49
+ loadAllSpecialists(): Promise<Map<string, SpecialistDefinition>>;
50
+ /**
51
+ * Load a single specialist from a markdown file
52
+ */
53
+ loadSpecialist(filePath: string): Promise<SpecialistDefinition | null>;
54
+ /**
55
+ * Parse specialist markdown file with YAML frontmatter
56
+ */
57
+ private parseSpecialistFile;
58
+ /**
59
+ * Get a specific specialist by ID
60
+ */
61
+ getSpecialist(specialistId: string): Promise<SpecialistDefinition | null>;
62
+ /**
63
+ * Get all loaded specialists
64
+ */
65
+ getAllSpecialists(): Promise<SpecialistDefinition[]>;
66
+ /**
67
+ * Get specialists by team
68
+ */
69
+ getSpecialistsByTeam(team: string): Promise<SpecialistDefinition[]>;
70
+ /**
71
+ * Get specialists by domain expertise
72
+ */
73
+ getSpecialistsByDomain(domain: string): Promise<SpecialistDefinition[]>;
74
+ /**
75
+ * Extract character guide sections from specialist content
76
+ */
77
+ extractCharacterGuide(specialist: SpecialistDefinition): SpecialistCharacterGuide;
78
+ private extractSection;
79
+ /**
80
+ * Find specialists who can collaborate with the given specialist
81
+ */
82
+ getCollaborators(specialistId: string): Promise<{
83
+ handoffs: SpecialistDefinition[];
84
+ consultations: SpecialistDefinition[];
85
+ related: SpecialistDefinition[];
86
+ }>;
87
+ /**
88
+ * Get specialist suggestions for a given context or problem
89
+ */
90
+ suggestSpecialist(context: string, problemType?: string): Promise<SpecialistDefinition[]>;
91
+ /**
92
+ * Get statistics about loaded specialists
93
+ */
94
+ getStatistics(): {
95
+ total_specialists: number;
96
+ teams: Record<string, number>;
97
+ domains: Record<string, number>;
98
+ average_collaborators: number;
99
+ };
100
+ }
101
+ //# sourceMappingURL=specialist-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-loader.d.ts","sourceRoot":"","sources":["../../src/services/specialist-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,uBAAuB,CAAC;IACvC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,gBAAgB;IAIf,OAAO,CAAC,eAAe;IAHnC,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,MAAM,CAAS;gBAEH,eAAe,EAAE,MAAM;IAE3C;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAiCtE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAW5E;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuD3B;;OAEG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQ/E;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAQ1D;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAKzE;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAK7E;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,oBAAoB,GAAG,wBAAwB;IAcjF,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,QAAQ,EAAE,oBAAoB,EAAE,CAAC;QACjC,aAAa,EAAE,oBAAoB,EAAE,CAAC;QACtC,OAAO,EAAE,oBAAoB,EAAE,CAAC;KACjC,CAAC;IAuBF;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2ClC;;OAEG;IACH,aAAa,IAAI;QACf,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,qBAAqB,EAAE,MAAM,CAAC;KAC/B;CA8BF"}