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.
- package/README.md +99 -9
- package/dist/cli/bc-code-intel-cli.js +0 -1
- package/dist/cli/bc-code-intel-cli.js.map +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -44
- package/dist/index.js.map +1 -1
- package/dist/layers/embedded-layer.d.ts +74 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -1
- package/dist/layers/embedded-layer.js +286 -3
- package/dist/layers/embedded-layer.js.map +1 -1
- package/dist/layers/layer-service.d.ts +6 -0
- package/dist/layers/layer-service.d.ts.map +1 -1
- package/dist/layers/layer-service.js +13 -0
- package/dist/layers/layer-service.js.map +1 -1
- package/dist/services/agent-onboarding-service.d.ts +45 -0
- package/dist/services/agent-onboarding-service.d.ts.map +1 -0
- package/dist/services/agent-onboarding-service.js +372 -0
- package/dist/services/agent-onboarding-service.js.map +1 -0
- package/dist/services/enhanced-prompt-service.d.ts +56 -0
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
- package/dist/services/enhanced-prompt-service.js +143 -0
- package/dist/services/enhanced-prompt-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +6 -19
- package/dist/services/knowledge-service.d.ts.map +1 -1
- package/dist/services/knowledge-service.js +73 -129
- package/dist/services/knowledge-service.js.map +1 -1
- package/dist/services/methodology-service.d.ts.map +1 -1
- package/dist/services/methodology-service.js +1 -4
- package/dist/services/methodology-service.js.map +1 -1
- package/dist/services/multi-content-layer-service.d.ts +92 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -0
- package/dist/services/multi-content-layer-service.js +407 -0
- package/dist/services/multi-content-layer-service.js.map +1 -0
- package/dist/services/roleplay-engine.d.ts +153 -0
- package/dist/services/roleplay-engine.d.ts.map +1 -0
- package/dist/services/roleplay-engine.js +862 -0
- package/dist/services/roleplay-engine.js.map +1 -0
- package/dist/services/session-storage/file-storage.d.ts +30 -0
- package/dist/services/session-storage/file-storage.d.ts.map +1 -0
- package/dist/services/session-storage/file-storage.js +229 -0
- package/dist/services/session-storage/file-storage.js.map +1 -0
- package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
- package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
- package/dist/services/session-storage/in-memory-storage.js +142 -0
- package/dist/services/session-storage/in-memory-storage.js.map +1 -0
- package/dist/services/specialist-discovery.d.ts +80 -0
- package/dist/services/specialist-discovery.d.ts.map +1 -0
- package/dist/services/specialist-discovery.js +277 -0
- package/dist/services/specialist-discovery.js.map +1 -0
- package/dist/services/specialist-handoff-service.d.ts +81 -0
- package/dist/services/specialist-handoff-service.d.ts.map +1 -0
- package/dist/services/specialist-handoff-service.js +470 -0
- package/dist/services/specialist-handoff-service.js.map +1 -0
- package/dist/services/specialist-loader.d.ts +101 -0
- package/dist/services/specialist-loader.d.ts.map +1 -0
- package/dist/services/specialist-loader.js +248 -0
- package/dist/services/specialist-loader.js.map +1 -0
- package/dist/services/specialist-session-manager.d.ts +76 -0
- package/dist/services/specialist-session-manager.d.ts.map +1 -0
- package/dist/services/specialist-session-manager.js +255 -0
- package/dist/services/specialist-session-manager.js.map +1 -0
- package/dist/services/workflow-service.d.ts +9 -3
- package/dist/services/workflow-service.d.ts.map +1 -1
- package/dist/services/workflow-service.js +95 -13
- package/dist/services/workflow-service.js.map +1 -1
- package/dist/test-enhanced-mcp-server.js +2 -2
- package/dist/test-enhanced-mcp-server.js.map +1 -1
- package/dist/tools/specialist-discovery-tools.d.ts +27 -0
- package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
- package/dist/tools/specialist-discovery-tools.js +287 -0
- package/dist/tools/specialist-discovery-tools.js.map +1 -0
- package/dist/tools/specialist-tools.d.ts +38 -0
- package/dist/tools/specialist-tools.d.ts.map +1 -0
- package/dist/tools/specialist-tools.js +322 -0
- package/dist/tools/specialist-tools.js.map +1 -0
- package/dist/types/config-types.d.ts +2 -0
- package/dist/types/config-types.d.ts.map +1 -1
- package/dist/types/config-types.js.map +1 -1
- package/dist/types/enhanced-layer-types.d.ts +193 -0
- package/dist/types/enhanced-layer-types.d.ts.map +1 -0
- package/dist/types/enhanced-layer-types.js +9 -0
- package/dist/types/enhanced-layer-types.js.map +1 -0
- package/dist/types/layer-types.d.ts +2 -0
- package/dist/types/layer-types.d.ts.map +1 -1
- package/dist/types/layer-types.js.map +1 -1
- package/dist/types/roleplay-types.d.ts +155 -0
- package/dist/types/roleplay-types.d.ts.map +1 -0
- package/dist/types/roleplay-types.js +8 -0
- package/dist/types/roleplay-types.js.map +1 -0
- package/dist/types/session-types.d.ts +127 -0
- package/dist/types/session-types.d.ts.map +1 -0
- package/dist/types/session-types.js +8 -0
- package/dist/types/session-types.js.map +1 -0
- package/embedded-knowledge/AGENTS.md +120 -11
- package/embedded-knowledge/README.md +20 -3
- package/embedded-knowledge/specialists/alex-architect.md +216 -0
- package/embedded-knowledge/specialists/casey-copilot.md +226 -0
- package/embedded-knowledge/specialists/chris-config.md +267 -0
- package/embedded-knowledge/specialists/dean-debug.md +222 -0
- package/embedded-knowledge/specialists/eva-errors.md +235 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
- package/embedded-knowledge/specialists/logan-legacy.md +209 -0
- package/embedded-knowledge/specialists/maya-mentor.md +211 -0
- package/embedded-knowledge/specialists/morgan-market.md +226 -0
- package/embedded-knowledge/specialists/quinn-tester.md +235 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
- package/embedded-knowledge/specialists/sam-coder.md +181 -0
- package/embedded-knowledge/specialists/seth-security.md +235 -0
- package/embedded-knowledge/specialists/taylor-docs.md +257 -0
- package/embedded-knowledge/specialists/uma-ux.md +235 -0
- package/package.json +3 -3
- package/dist/types/persona-types.d.ts +0 -77
- package/dist/types/persona-types.d.ts.map +0 -1
- package/dist/types/persona-types.js +0 -341
- 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"}
|