bc-code-intelligence-mcp 1.1.1 → 1.2.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 (98) 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 +8 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +82 -5
  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 +287 -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 +60 -0
  21. package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
  22. package/dist/services/enhanced-prompt-service.js +162 -0
  23. package/dist/services/enhanced-prompt-service.js.map +1 -0
  24. package/dist/services/multi-content-layer-service.d.ts +92 -0
  25. package/dist/services/multi-content-layer-service.d.ts.map +1 -0
  26. package/dist/services/multi-content-layer-service.js +407 -0
  27. package/dist/services/multi-content-layer-service.js.map +1 -0
  28. package/dist/services/roleplay-engine.d.ts +121 -0
  29. package/dist/services/roleplay-engine.d.ts.map +1 -0
  30. package/dist/services/roleplay-engine.js +672 -0
  31. package/dist/services/roleplay-engine.js.map +1 -0
  32. package/dist/services/session-storage/file-storage.d.ts +30 -0
  33. package/dist/services/session-storage/file-storage.d.ts.map +1 -0
  34. package/dist/services/session-storage/file-storage.js +229 -0
  35. package/dist/services/session-storage/file-storage.js.map +1 -0
  36. package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
  37. package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
  38. package/dist/services/session-storage/in-memory-storage.js +142 -0
  39. package/dist/services/session-storage/in-memory-storage.js.map +1 -0
  40. package/dist/services/specialist-discovery.d.ts +76 -0
  41. package/dist/services/specialist-discovery.d.ts.map +1 -0
  42. package/dist/services/specialist-discovery.js +270 -0
  43. package/dist/services/specialist-discovery.js.map +1 -0
  44. package/dist/services/specialist-handoff-service.d.ts +81 -0
  45. package/dist/services/specialist-handoff-service.d.ts.map +1 -0
  46. package/dist/services/specialist-handoff-service.js +470 -0
  47. package/dist/services/specialist-handoff-service.js.map +1 -0
  48. package/dist/services/specialist-loader.d.ts +101 -0
  49. package/dist/services/specialist-loader.d.ts.map +1 -0
  50. package/dist/services/specialist-loader.js +249 -0
  51. package/dist/services/specialist-loader.js.map +1 -0
  52. package/dist/services/specialist-session-manager.d.ts +76 -0
  53. package/dist/services/specialist-session-manager.d.ts.map +1 -0
  54. package/dist/services/specialist-session-manager.js +255 -0
  55. package/dist/services/specialist-session-manager.js.map +1 -0
  56. package/dist/tools/specialist-discovery-tools.d.ts +27 -0
  57. package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
  58. package/dist/tools/specialist-discovery-tools.js +287 -0
  59. package/dist/tools/specialist-discovery-tools.js.map +1 -0
  60. package/dist/tools/specialist-tools.d.ts +38 -0
  61. package/dist/tools/specialist-tools.d.ts.map +1 -0
  62. package/dist/tools/specialist-tools.js +322 -0
  63. package/dist/tools/specialist-tools.js.map +1 -0
  64. package/dist/types/config-types.d.ts +2 -0
  65. package/dist/types/config-types.d.ts.map +1 -1
  66. package/dist/types/config-types.js.map +1 -1
  67. package/dist/types/enhanced-layer-types.d.ts +193 -0
  68. package/dist/types/enhanced-layer-types.d.ts.map +1 -0
  69. package/dist/types/enhanced-layer-types.js +9 -0
  70. package/dist/types/enhanced-layer-types.js.map +1 -0
  71. package/dist/types/layer-types.d.ts +2 -0
  72. package/dist/types/layer-types.d.ts.map +1 -1
  73. package/dist/types/layer-types.js.map +1 -1
  74. package/dist/types/roleplay-types.d.ts +149 -0
  75. package/dist/types/roleplay-types.d.ts.map +1 -0
  76. package/dist/types/roleplay-types.js +8 -0
  77. package/dist/types/roleplay-types.js.map +1 -0
  78. package/dist/types/session-types.d.ts +111 -0
  79. package/dist/types/session-types.d.ts.map +1 -0
  80. package/dist/types/session-types.js +8 -0
  81. package/dist/types/session-types.js.map +1 -0
  82. package/embedded-knowledge/AGENTS.md +119 -10
  83. package/embedded-knowledge/README.md +20 -3
  84. package/embedded-knowledge/specialists/alex-architect.md +216 -0
  85. package/embedded-knowledge/specialists/casey-copilot.md +226 -0
  86. package/embedded-knowledge/specialists/dean-debug.md +222 -0
  87. package/embedded-knowledge/specialists/eva-errors.md +235 -0
  88. package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
  89. package/embedded-knowledge/specialists/logan-legacy.md +209 -0
  90. package/embedded-knowledge/specialists/maya-mentor.md +211 -0
  91. package/embedded-knowledge/specialists/morgan-market.md +226 -0
  92. package/embedded-knowledge/specialists/quinn-tester.md +235 -0
  93. package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
  94. package/embedded-knowledge/specialists/sam-coder.md +181 -0
  95. package/embedded-knowledge/specialists/seth-security.md +235 -0
  96. package/embedded-knowledge/specialists/taylor-docs.md +257 -0
  97. package/embedded-knowledge/specialists/uma-ux.md +235 -0
  98. package/package.json +3 -3
@@ -0,0 +1,249 @@
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
+ import * as fs from 'fs/promises';
9
+ import * as path from 'path';
10
+ import * as yaml from 'yaml';
11
+ export class SpecialistLoader {
12
+ specialistsPath;
13
+ specialistCache = new Map();
14
+ loaded = false;
15
+ constructor(specialistsPath) {
16
+ this.specialistsPath = specialistsPath;
17
+ }
18
+ /**
19
+ * Load all specialist definitions from the specialists folder
20
+ */
21
+ async loadAllSpecialists() {
22
+ if (this.loaded && this.specialistCache.size > 0) {
23
+ return this.specialistCache;
24
+ }
25
+ console.error('📋 Loading specialist personas...');
26
+ try {
27
+ const specialistFiles = await fs.readdir(this.specialistsPath);
28
+ const markdownFiles = specialistFiles.filter(file => file.endsWith('.md'));
29
+ console.error(`📋 Found ${markdownFiles.length} specialist files`);
30
+ for (const file of markdownFiles) {
31
+ const filePath = path.join(this.specialistsPath, file);
32
+ const specialist = await this.loadSpecialist(filePath);
33
+ if (specialist) {
34
+ this.specialistCache.set(specialist.specialist_id, specialist);
35
+ console.error(`✅ Loaded specialist: ${specialist.specialist_id} (${specialist.title})`);
36
+ }
37
+ }
38
+ this.loaded = true;
39
+ console.error(`🎭 Successfully loaded ${this.specialistCache.size} specialists`);
40
+ return this.specialistCache;
41
+ }
42
+ catch (error) {
43
+ console.error('❌ Failed to load specialists:', error);
44
+ throw error;
45
+ }
46
+ }
47
+ /**
48
+ * Load a single specialist from a markdown file
49
+ */
50
+ async loadSpecialist(filePath) {
51
+ try {
52
+ const fileContent = await fs.readFile(filePath, 'utf-8');
53
+ return this.parseSpecialistFile(fileContent, filePath);
54
+ }
55
+ catch (error) {
56
+ console.error(`❌ Failed to load specialist from ${filePath}:`, error);
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Parse specialist markdown file with YAML frontmatter
62
+ */
63
+ parseSpecialistFile(content, filePath) {
64
+ try {
65
+ // Extract frontmatter and content
66
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
67
+ if (!frontmatterMatch) {
68
+ console.error(`⚠️ No frontmatter found in ${filePath}`);
69
+ return null;
70
+ }
71
+ const [, frontmatterStr, markdownContent] = frontmatterMatch;
72
+ // Parse YAML frontmatter
73
+ const frontmatter = yaml.parse(frontmatterStr);
74
+ // Validate required fields
75
+ if (!frontmatter.specialist_id || !frontmatter.title) {
76
+ console.error(`⚠️ Missing required fields in ${filePath}`);
77
+ return null;
78
+ }
79
+ // Create specialist definition
80
+ const specialist = {
81
+ title: frontmatter.title,
82
+ specialist_id: frontmatter.specialist_id,
83
+ emoji: frontmatter.emoji || '🤖',
84
+ role: frontmatter.role || 'Specialist',
85
+ team: frontmatter.team || 'General',
86
+ persona: {
87
+ personality: frontmatter.persona?.personality || [],
88
+ communication_style: frontmatter.persona?.communication_style || '',
89
+ greeting: frontmatter.persona?.greeting || `${frontmatter.emoji || '🤖'} Hello!`
90
+ },
91
+ expertise: {
92
+ primary: frontmatter.expertise?.primary || [],
93
+ secondary: frontmatter.expertise?.secondary || []
94
+ },
95
+ domains: frontmatter.domains || [],
96
+ when_to_use: frontmatter.when_to_use || [],
97
+ collaboration: {
98
+ natural_handoffs: frontmatter.collaboration?.natural_handoffs || [],
99
+ team_consultations: frontmatter.collaboration?.team_consultations || []
100
+ },
101
+ related_specialists: frontmatter.related_specialists || [],
102
+ content: markdownContent.trim()
103
+ };
104
+ return specialist;
105
+ }
106
+ catch (error) {
107
+ console.error(`❌ Failed to parse specialist file ${filePath}:`, error);
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * Get a specific specialist by ID
113
+ */
114
+ async getSpecialist(specialistId) {
115
+ if (!this.loaded) {
116
+ await this.loadAllSpecialists();
117
+ }
118
+ return this.specialistCache.get(specialistId) || null;
119
+ }
120
+ /**
121
+ * Get all loaded specialists
122
+ */
123
+ async getAllSpecialists() {
124
+ if (!this.loaded) {
125
+ await this.loadAllSpecialists();
126
+ }
127
+ return Array.from(this.specialistCache.values());
128
+ }
129
+ /**
130
+ * Get specialists by team
131
+ */
132
+ async getSpecialistsByTeam(team) {
133
+ const specialists = await this.getAllSpecialists();
134
+ return specialists.filter(s => s.team === team);
135
+ }
136
+ /**
137
+ * Get specialists by domain expertise
138
+ */
139
+ async getSpecialistsByDomain(domain) {
140
+ const specialists = await this.getAllSpecialists();
141
+ return specialists.filter(s => s.domains.includes(domain));
142
+ }
143
+ /**
144
+ * Extract character guide sections from specialist content
145
+ */
146
+ extractCharacterGuide(specialist) {
147
+ const content = specialist.content;
148
+ // Extract major sections using markdown headers
149
+ const sections = content.split(/(?=^##\s)/m);
150
+ return {
151
+ identity_section: this.extractSection(sections, 'Character Identity') || '',
152
+ process_section: this.extractSection(sections, 'Process') || '',
153
+ examples_section: this.extractSection(sections, 'Examples') || '',
154
+ collaboration_section: this.extractSection(sections, 'Collaboration') || ''
155
+ };
156
+ }
157
+ extractSection(sections, sectionName) {
158
+ const section = sections.find(s => s.toLowerCase().includes(sectionName.toLowerCase()));
159
+ return section ? section.trim() : '';
160
+ }
161
+ /**
162
+ * Find specialists who can collaborate with the given specialist
163
+ */
164
+ async getCollaborators(specialistId) {
165
+ const specialist = await this.getSpecialist(specialistId);
166
+ if (!specialist) {
167
+ return { handoffs: [], consultations: [], related: [] };
168
+ }
169
+ const allSpecialists = await this.getAllSpecialists();
170
+ const handoffs = specialist.collaboration.natural_handoffs
171
+ .map(id => allSpecialists.find(s => s.specialist_id === id))
172
+ .filter(s => s);
173
+ const consultations = specialist.collaboration.team_consultations
174
+ .map(id => allSpecialists.find(s => s.specialist_id === id))
175
+ .filter(s => s);
176
+ const related = specialist.related_specialists
177
+ .map(id => allSpecialists.find(s => s.specialist_id === id))
178
+ .filter(s => s);
179
+ return { handoffs, consultations, related };
180
+ }
181
+ /**
182
+ * Get specialist suggestions for a given context or problem
183
+ */
184
+ async suggestSpecialist(context, problemType) {
185
+ const specialists = await this.getAllSpecialists();
186
+ const suggestions = [];
187
+ for (const specialist of specialists) {
188
+ let score = 0;
189
+ // Check when_to_use scenarios
190
+ for (const scenario of specialist.when_to_use) {
191
+ if (context.toLowerCase().includes(scenario.toLowerCase()) ||
192
+ scenario.toLowerCase().includes(context.toLowerCase())) {
193
+ score += 10;
194
+ }
195
+ }
196
+ // Check expertise areas
197
+ for (const expertise of [...specialist.expertise.primary, ...specialist.expertise.secondary]) {
198
+ if (context.toLowerCase().includes(expertise.toLowerCase()) ||
199
+ expertise.toLowerCase().includes(context.toLowerCase())) {
200
+ score += specialist.expertise.primary.includes(expertise) ? 8 : 5;
201
+ }
202
+ }
203
+ // Check domains
204
+ for (const domain of specialist.domains) {
205
+ if (context.toLowerCase().includes(domain.toLowerCase()) ||
206
+ domain.toLowerCase().includes(context.toLowerCase())) {
207
+ score += 6;
208
+ }
209
+ }
210
+ if (score > 0) {
211
+ suggestions.push({ specialist, score });
212
+ }
213
+ }
214
+ // Sort by score and return top suggestions
215
+ return suggestions
216
+ .sort((a, b) => b.score - a.score)
217
+ .slice(0, 5)
218
+ .map(s => s.specialist);
219
+ }
220
+ /**
221
+ * Get statistics about loaded specialists
222
+ */
223
+ getStatistics() {
224
+ const specialists = Array.from(this.specialistCache.values());
225
+ const teams = {};
226
+ const domains = {};
227
+ let totalCollaborators = 0;
228
+ for (const specialist of specialists) {
229
+ // Count teams
230
+ teams[specialist.team] = (teams[specialist.team] || 0) + 1;
231
+ // Count domains
232
+ for (const domain of specialist.domains) {
233
+ domains[domain] = (domains[domain] || 0) + 1;
234
+ }
235
+ // Count collaborators
236
+ totalCollaborators +=
237
+ specialist.collaboration.natural_handoffs.length +
238
+ specialist.collaboration.team_consultations.length +
239
+ specialist.related_specialists.length;
240
+ }
241
+ return {
242
+ total_specialists: specialists.length,
243
+ teams,
244
+ domains,
245
+ average_collaborators: specialists.length > 0 ? totalCollaborators / specialists.length : 0
246
+ };
247
+ }
248
+ }
249
+ //# sourceMappingURL=specialist-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-loader.js","sourceRoot":"","sources":["../../src/services/specialist-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Specialist Session Manager
3
+ *
4
+ * Manages persistent, contextual conversations with BC specialist personas.
5
+ * Supports in-memory sessions by default with layer-configurable persistence.
6
+ */
7
+ import { SpecialistSession, SessionSummary, SessionMessage, SessionContext, SessionManager, SessionStorageConfig, SessionEvents } from '../types/session-types.js';
8
+ import { MultiContentLayerService } from './multi-content-layer-service.js';
9
+ export declare class SpecialistSessionManager implements SessionManager {
10
+ private storage;
11
+ private layerService;
12
+ private events;
13
+ constructor(layerService: MultiContentLayerService, storageConfig?: SessionStorageConfig);
14
+ /**
15
+ * Start a new specialist session
16
+ */
17
+ startSession(specialistId: string, userId: string, initialMessage?: string): Promise<SpecialistSession>;
18
+ /**
19
+ * Get existing session
20
+ */
21
+ getSession(sessionId: string): Promise<SpecialistSession | null>;
22
+ /**
23
+ * Continue existing session with new message
24
+ */
25
+ continueSession(sessionId: string, message: string): Promise<SpecialistSession>;
26
+ /**
27
+ * Transfer session to different specialist
28
+ */
29
+ transferSession(sessionId: string, toSpecialistId: string): Promise<SpecialistSession>;
30
+ /**
31
+ * End session
32
+ */
33
+ endSession(sessionId: string): Promise<void>;
34
+ /**
35
+ * List user's sessions
36
+ */
37
+ listUserSessions(userId: string): Promise<SessionSummary[]>;
38
+ /**
39
+ * List user's active sessions
40
+ */
41
+ listActiveSessions(userId: string): Promise<SessionSummary[]>;
42
+ /**
43
+ * Add message to session
44
+ */
45
+ addMessage(sessionId: string, message: SessionMessage): Promise<void>;
46
+ /**
47
+ * Update session context
48
+ */
49
+ updateContext(sessionId: string, context: Partial<SessionContext>): Promise<void>;
50
+ /**
51
+ * Cleanup expired sessions
52
+ */
53
+ cleanupSessions(): Promise<number>;
54
+ /**
55
+ * Subscribe to session events
56
+ */
57
+ on<K extends keyof SessionEvents>(event: K, handler: SessionEvents[K]): void;
58
+ /**
59
+ * Get session statistics
60
+ */
61
+ getSessionStats(userId?: string): Promise<{
62
+ totalSessions: number;
63
+ activeSessions: number;
64
+ totalMessages: number;
65
+ averageSessionLength: number;
66
+ }>;
67
+ /**
68
+ * Initialize storage based on configuration
69
+ */
70
+ private initializeStorage;
71
+ /**
72
+ * Get all session summaries (for stats)
73
+ */
74
+ private getAllSessionSummaries;
75
+ }
76
+ //# sourceMappingURL=specialist-session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-session-manager.d.ts","sourceRoot":"","sources":["../../src/services/specialist-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EAEd,oBAAoB,EACpB,aAAa,EACd,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,qBAAa,wBAAyB,YAAW,cAAc;IAC7D,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,MAAM,CAA8B;gBAG1C,YAAY,EAAE,wBAAwB,EACtC,aAAa,CAAC,EAAE,oBAAoB;IAQtC;;OAEG;IACG,YAAY,CAChB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAgD7B;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAItE;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmBrF;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyC5F;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAIjE;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAInE;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3E;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxC;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAI5E;;OAEG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9C,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IAkBF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;YACW,sBAAsB;CAUrC"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Specialist Session Manager
3
+ *
4
+ * Manages persistent, contextual conversations with BC specialist personas.
5
+ * Supports in-memory sessions by default with layer-configurable persistence.
6
+ */
7
+ import { randomUUID } from 'crypto';
8
+ import { InMemorySessionStorage } from './session-storage/in-memory-storage.js';
9
+ import { FileSessionStorage } from './session-storage/file-storage.js';
10
+ export class SpecialistSessionManager {
11
+ storage;
12
+ layerService;
13
+ events = {};
14
+ constructor(layerService, storageConfig) {
15
+ this.layerService = layerService;
16
+ // Initialize storage based on configuration
17
+ this.storage = this.initializeStorage(storageConfig);
18
+ }
19
+ /**
20
+ * Start a new specialist session
21
+ */
22
+ async startSession(specialistId, userId, initialMessage) {
23
+ // Validate specialist exists
24
+ const specialists = await this.layerService.getAllSpecialists();
25
+ const specialist = specialists.find(s => s.specialist_id === specialistId);
26
+ if (!specialist) {
27
+ throw new Error(`Specialist '${specialistId}' not found`);
28
+ }
29
+ const sessionId = randomUUID();
30
+ const now = new Date();
31
+ const session = {
32
+ sessionId,
33
+ specialistId,
34
+ userId,
35
+ startTime: now,
36
+ lastActivity: now,
37
+ status: 'active',
38
+ messages: [],
39
+ messageCount: 0,
40
+ context: {
41
+ solutions: [],
42
+ recommendations: [],
43
+ nextSteps: [],
44
+ userPreferences: {}
45
+ }
46
+ };
47
+ // Add initial message if provided
48
+ if (initialMessage) {
49
+ const initialMsg = {
50
+ id: randomUUID(),
51
+ timestamp: now,
52
+ type: 'user',
53
+ content: initialMessage
54
+ };
55
+ session.messages.push(initialMsg);
56
+ session.messageCount = 1;
57
+ }
58
+ await this.storage.createSession(session);
59
+ // Emit event
60
+ this.events.sessionStarted?.(session);
61
+ return session;
62
+ }
63
+ /**
64
+ * Get existing session
65
+ */
66
+ async getSession(sessionId) {
67
+ return await this.storage.getSession(sessionId);
68
+ }
69
+ /**
70
+ * Continue existing session with new message
71
+ */
72
+ async continueSession(sessionId, message) {
73
+ const session = await this.storage.getSession(sessionId);
74
+ if (!session) {
75
+ throw new Error(`Session '${sessionId}' not found`);
76
+ }
77
+ // Add user message
78
+ const userMessage = {
79
+ id: randomUUID(),
80
+ timestamp: new Date(),
81
+ type: 'user',
82
+ content: message
83
+ };
84
+ await this.addMessage(sessionId, userMessage);
85
+ return await this.storage.getSession(sessionId);
86
+ }
87
+ /**
88
+ * Transfer session to different specialist
89
+ */
90
+ async transferSession(sessionId, toSpecialistId) {
91
+ const session = await this.storage.getSession(sessionId);
92
+ if (!session) {
93
+ throw new Error(`Session '${sessionId}' not found`);
94
+ }
95
+ // Validate target specialist exists
96
+ const specialists = await this.layerService.getAllSpecialists();
97
+ const targetSpecialist = specialists.find(s => s.specialist_id === toSpecialistId);
98
+ if (!targetSpecialist) {
99
+ throw new Error(`Target specialist '${toSpecialistId}' not found`);
100
+ }
101
+ const fromSpecialistId = session.specialistId;
102
+ // Update session
103
+ session.transferredFrom = session.specialistId;
104
+ session.specialistId = toSpecialistId;
105
+ session.transferredTo = toSpecialistId;
106
+ session.lastActivity = new Date();
107
+ // Add transfer message
108
+ const transferMessage = {
109
+ id: randomUUID(),
110
+ timestamp: new Date(),
111
+ type: 'specialist',
112
+ specialistId: 'system',
113
+ content: `Session transferred from ${fromSpecialistId} to ${toSpecialistId}`
114
+ };
115
+ session.messages.push(transferMessage);
116
+ session.messageCount++;
117
+ await this.storage.updateSession(session);
118
+ // Emit event
119
+ this.events.sessionTransferred?.(sessionId, fromSpecialistId, toSpecialistId);
120
+ return session;
121
+ }
122
+ /**
123
+ * End session
124
+ */
125
+ async endSession(sessionId) {
126
+ const session = await this.storage.getSession(sessionId);
127
+ if (!session) {
128
+ throw new Error(`Session '${sessionId}' not found`);
129
+ }
130
+ session.status = 'completed';
131
+ session.lastActivity = new Date();
132
+ await this.storage.updateSession(session);
133
+ // Emit event
134
+ this.events.sessionEnded?.(sessionId);
135
+ }
136
+ /**
137
+ * List user's sessions
138
+ */
139
+ async listUserSessions(userId) {
140
+ return await this.storage.getUserSessions(userId);
141
+ }
142
+ /**
143
+ * List user's active sessions
144
+ */
145
+ async listActiveSessions(userId) {
146
+ return await this.storage.getActiveSessions(userId);
147
+ }
148
+ /**
149
+ * Add message to session
150
+ */
151
+ async addMessage(sessionId, message) {
152
+ const session = await this.storage.getSession(sessionId);
153
+ if (!session) {
154
+ throw new Error(`Session '${sessionId}' not found`);
155
+ }
156
+ session.messages.push(message);
157
+ session.messageCount++;
158
+ session.lastActivity = new Date();
159
+ // Update session status to active if it was paused
160
+ if (session.status === 'paused') {
161
+ session.status = 'active';
162
+ }
163
+ await this.storage.updateSession(session);
164
+ // Emit event
165
+ this.events.messageAdded?.(sessionId, message);
166
+ }
167
+ /**
168
+ * Update session context
169
+ */
170
+ async updateContext(sessionId, context) {
171
+ const session = await this.storage.getSession(sessionId);
172
+ if (!session) {
173
+ throw new Error(`Session '${sessionId}' not found`);
174
+ }
175
+ // Merge context updates
176
+ session.context = {
177
+ ...session.context,
178
+ ...context,
179
+ // Handle array merging properly
180
+ solutions: [...(session.context.solutions || []), ...(context.solutions || [])],
181
+ recommendations: [...(session.context.recommendations || []), ...(context.recommendations || [])],
182
+ nextSteps: [...(session.context.nextSteps || []), ...(context.nextSteps || [])],
183
+ userPreferences: {
184
+ ...session.context.userPreferences,
185
+ ...context.userPreferences
186
+ }
187
+ };
188
+ session.lastActivity = new Date();
189
+ await this.storage.updateSession(session);
190
+ }
191
+ /**
192
+ * Cleanup expired sessions
193
+ */
194
+ async cleanupSessions() {
195
+ return await this.storage.cleanupExpiredSessions();
196
+ }
197
+ /**
198
+ * Subscribe to session events
199
+ */
200
+ on(event, handler) {
201
+ this.events[event] = handler;
202
+ }
203
+ /**
204
+ * Get session statistics
205
+ */
206
+ async getSessionStats(userId) {
207
+ const sessions = userId
208
+ ? await this.storage.getUserSessions(userId)
209
+ : await this.getAllSessionSummaries();
210
+ const totalSessions = sessions.length;
211
+ const activeSessions = sessions.filter(s => s.status === 'active' || s.status === 'paused').length;
212
+ const totalMessages = sessions.reduce((sum, s) => sum + s.messageCount, 0);
213
+ const averageSessionLength = totalSessions > 0 ? totalMessages / totalSessions : 0;
214
+ return {
215
+ totalSessions,
216
+ activeSessions,
217
+ totalMessages,
218
+ averageSessionLength: Math.round(averageSessionLength * 100) / 100
219
+ };
220
+ }
221
+ /**
222
+ * Initialize storage based on configuration
223
+ */
224
+ initializeStorage(config) {
225
+ console.error(`🗄️ Initializing session storage: ${config?.type || 'memory'}`);
226
+ switch (config?.type || 'memory') {
227
+ case 'memory':
228
+ return new InMemorySessionStorage(config);
229
+ case 'file':
230
+ return new FileSessionStorage(config);
231
+ case 'database':
232
+ // TODO: Implement DatabaseSessionStorage
233
+ throw new Error('Database storage not yet implemented. Use memory or file storage for now.');
234
+ case 'mcp':
235
+ // TODO: Implement MCPSessionStorage
236
+ throw new Error('MCP storage not yet implemented. Use memory or file storage for now.');
237
+ default:
238
+ console.warn(`Unknown storage type '${config?.type}', falling back to memory storage`);
239
+ return new InMemorySessionStorage(config);
240
+ }
241
+ }
242
+ /**
243
+ * Get all session summaries (for stats)
244
+ */
245
+ async getAllSessionSummaries() {
246
+ // This is a bit of a hack since we don't have a "get all sessions" method
247
+ // In practice, this would be implemented differently for each storage backend
248
+ if (this.storage instanceof InMemorySessionStorage) {
249
+ // For in-memory storage, we can access the internal data
250
+ return []; // Simplified for now
251
+ }
252
+ return [];
253
+ }
254
+ }
255
+ //# sourceMappingURL=specialist-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-session-manager.js","sourceRoot":"","sources":["../../src/services/specialist-session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MCP Tools for Specialist Discovery and Management
3
+ *
4
+ * Provides tools for discovering specialists, getting recommendations,
5
+ * and managing specialist interactions.
6
+ */
7
+ import { CallToolRequest, CallToolResult, Tool } from '@modelcontextprotocol/sdk/types.js';
8
+ import { SpecialistDiscoveryService } from '../services/specialist-discovery.js';
9
+ import { SpecialistSessionManager } from '../services/specialist-session-manager.js';
10
+ import { MultiContentLayerService } from '../services/multi-content-layer-service.js';
11
+ export declare const SPECIALIST_DISCOVERY_TOOLS: Tool[];
12
+ export declare class SpecialistDiscoveryTools {
13
+ private discoveryService;
14
+ private sessionManager;
15
+ private layerService;
16
+ constructor(discoveryService: SpecialistDiscoveryService, sessionManager: SpecialistSessionManager, layerService: MultiContentLayerService);
17
+ /**
18
+ * Get tool definitions for MCP registration
19
+ */
20
+ getToolDefinitions(): Tool[];
21
+ handleToolCall(request: CallToolRequest): Promise<CallToolResult>;
22
+ private discoverSpecialists;
23
+ private browseSpecialists;
24
+ private getSpecialistInfo;
25
+ private generateExampleQuery;
26
+ }
27
+ //# sourceMappingURL=specialist-discovery-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialist-discovery-tools.d.ts","sourceRoot":"","sources":["../../src/tools/specialist-discovery-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE3F,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAmBtF,eAAO,MAAM,0BAA0B,EAAE,IAAI,EA+D5C,CAAC;AAEF,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,YAAY;gBAFZ,gBAAgB,EAAE,0BAA0B,EAC5C,cAAc,EAAE,wBAAwB,EACxC,YAAY,EAAE,wBAAwB;IAGhD;;OAEG;IACH,kBAAkB,IAAI,IAAI,EAAE;IAItB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YAyBzD,mBAAmB;YA2DnB,iBAAiB;YAwDjB,iBAAiB;IAqE/B,OAAO,CAAC,oBAAoB;CAW7B"}