@deimoscloud/coreai 0.1.9 → 0.1.10

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 (196) hide show
  1. package/dist/cli/index.js +1 -1
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/package.json +6 -1
  6. package/.prettierrc +0 -9
  7. package/AGENT_SPEC.md +0 -347
  8. package/ARCHITECTURE.md +0 -547
  9. package/DRAFT_PRD.md +0 -1440
  10. package/IMPLEMENTATION_PLAN.md +0 -256
  11. package/PRODUCT.md +0 -473
  12. package/WORKFLOWS.md +0 -295
  13. package/commands/core/check-inbox.md +0 -34
  14. package/commands/core/delegate.md +0 -30
  15. package/commands/core/git-commit.md +0 -144
  16. package/commands/core/pr-create.md +0 -193
  17. package/commands/core/review.md +0 -56
  18. package/commands/core/sprint-status.md +0 -65
  19. package/commands/optional/docs-update.md +0 -200
  20. package/commands/optional/jira-create.md +0 -200
  21. package/commands/optional/jira-transition.md +0 -184
  22. package/commands/optional/worktree-cleanup.md +0 -167
  23. package/commands/optional/worktree-setup.md +0 -110
  24. package/eslint.config.js +0 -29
  25. package/jest.config.js +0 -22
  26. package/knowledge-library/README.md +0 -118
  27. package/knowledge-library/android-engineer/context/current.txt +0 -42
  28. package/knowledge-library/android-engineer/control/decisions.txt +0 -9
  29. package/knowledge-library/android-engineer/control/dependencies.txt +0 -19
  30. package/knowledge-library/android-engineer/control/objectives.txt +0 -26
  31. package/knowledge-library/android-engineer/history/.gitkeep +0 -0
  32. package/knowledge-library/android-engineer/inbox/processed/.gitkeep +0 -0
  33. package/knowledge-library/android-engineer/outbox/.gitkeep +0 -0
  34. package/knowledge-library/android-engineer/tech/.gitkeep +0 -0
  35. package/knowledge-library/architecture.txt +0 -61
  36. package/knowledge-library/backend-engineer/context/current.txt +0 -42
  37. package/knowledge-library/backend-engineer/control/decisions.txt +0 -9
  38. package/knowledge-library/backend-engineer/control/dependencies.txt +0 -19
  39. package/knowledge-library/backend-engineer/control/objectives.txt +0 -26
  40. package/knowledge-library/backend-engineer/history/.gitkeep +0 -0
  41. package/knowledge-library/backend-engineer/inbox/processed/.gitkeep +0 -0
  42. package/knowledge-library/backend-engineer/outbox/.gitkeep +0 -0
  43. package/knowledge-library/backend-engineer/tech/.gitkeep +0 -0
  44. package/knowledge-library/context.txt +0 -52
  45. package/knowledge-library/devops-engineer/context/current.txt +0 -42
  46. package/knowledge-library/devops-engineer/control/decisions.txt +0 -9
  47. package/knowledge-library/devops-engineer/control/dependencies.txt +0 -19
  48. package/knowledge-library/devops-engineer/control/objectives.txt +0 -26
  49. package/knowledge-library/devops-engineer/history/.gitkeep +0 -0
  50. package/knowledge-library/devops-engineer/inbox/processed/.gitkeep +0 -0
  51. package/knowledge-library/devops-engineer/outbox/.gitkeep +0 -0
  52. package/knowledge-library/devops-engineer/tech/.gitkeep +0 -0
  53. package/knowledge-library/engineering-manager/context/current.txt +0 -40
  54. package/knowledge-library/engineering-manager/control/decisions.txt +0 -9
  55. package/knowledge-library/engineering-manager/control/objectives.txt +0 -27
  56. package/knowledge-library/engineering-manager/history/.gitkeep +0 -0
  57. package/knowledge-library/engineering-manager/inbox/processed/.gitkeep +0 -0
  58. package/knowledge-library/engineering-manager/outbox/.gitkeep +0 -0
  59. package/knowledge-library/engineering-manager/tech/.gitkeep +0 -0
  60. package/knowledge-library/prd.txt +0 -81
  61. package/knowledge-library/product-manager/context/current.txt +0 -42
  62. package/knowledge-library/product-manager/control/decisions.txt +0 -9
  63. package/knowledge-library/product-manager/control/dependencies.txt +0 -19
  64. package/knowledge-library/product-manager/control/objectives.txt +0 -26
  65. package/knowledge-library/product-manager/history/.gitkeep +0 -0
  66. package/knowledge-library/product-manager/inbox/processed/.gitkeep +0 -0
  67. package/knowledge-library/product-manager/outbox/.gitkeep +0 -0
  68. package/knowledge-library/product-manager/tech/.gitkeep +0 -0
  69. package/knowledge-library/qa-engineer/context/current.txt +0 -42
  70. package/knowledge-library/qa-engineer/control/decisions.txt +0 -9
  71. package/knowledge-library/qa-engineer/control/dependencies.txt +0 -19
  72. package/knowledge-library/qa-engineer/control/objectives.txt +0 -26
  73. package/knowledge-library/qa-engineer/history/.gitkeep +0 -0
  74. package/knowledge-library/qa-engineer/inbox/processed/.gitkeep +0 -0
  75. package/knowledge-library/qa-engineer/outbox/.gitkeep +0 -0
  76. package/knowledge-library/qa-engineer/tech/.gitkeep +0 -0
  77. package/knowledge-library/security-engineer/context/current.txt +0 -42
  78. package/knowledge-library/security-engineer/control/decisions.txt +0 -9
  79. package/knowledge-library/security-engineer/control/dependencies.txt +0 -19
  80. package/knowledge-library/security-engineer/control/objectives.txt +0 -26
  81. package/knowledge-library/security-engineer/history/.gitkeep +0 -0
  82. package/knowledge-library/security-engineer/inbox/processed/.gitkeep +0 -0
  83. package/knowledge-library/security-engineer/outbox/.gitkeep +0 -0
  84. package/knowledge-library/security-engineer/tech/.gitkeep +0 -0
  85. package/knowledge-library/solutions-architect/context/current.txt +0 -42
  86. package/knowledge-library/solutions-architect/control/decisions.txt +0 -9
  87. package/knowledge-library/solutions-architect/control/dependencies.txt +0 -19
  88. package/knowledge-library/solutions-architect/control/objectives.txt +0 -26
  89. package/knowledge-library/solutions-architect/history/.gitkeep +0 -0
  90. package/knowledge-library/solutions-architect/inbox/processed/.gitkeep +0 -0
  91. package/knowledge-library/solutions-architect/outbox/.gitkeep +0 -0
  92. package/knowledge-library/solutions-architect/tech/.gitkeep +0 -0
  93. package/knowledge-library/wearos-engineer/context/current.txt +0 -42
  94. package/knowledge-library/wearos-engineer/control/decisions.txt +0 -9
  95. package/knowledge-library/wearos-engineer/control/dependencies.txt +0 -19
  96. package/knowledge-library/wearos-engineer/control/objectives.txt +0 -26
  97. package/knowledge-library/wearos-engineer/history/.gitkeep +0 -0
  98. package/knowledge-library/wearos-engineer/inbox/processed/.gitkeep +0 -0
  99. package/knowledge-library/wearos-engineer/outbox/.gitkeep +0 -0
  100. package/knowledge-library/wearos-engineer/tech/.gitkeep +0 -0
  101. package/scripts/add-agent.sh +0 -323
  102. package/scripts/install.sh +0 -354
  103. package/src/adapters/factory.test.ts +0 -386
  104. package/src/adapters/factory.ts +0 -305
  105. package/src/adapters/index.ts +0 -113
  106. package/src/adapters/interfaces.ts +0 -268
  107. package/src/adapters/mcp/client.test.ts +0 -130
  108. package/src/adapters/mcp/client.ts +0 -451
  109. package/src/adapters/mcp/discovery.test.ts +0 -315
  110. package/src/adapters/mcp/discovery.ts +0 -340
  111. package/src/adapters/mcp/index.ts +0 -66
  112. package/src/adapters/mcp/mapper.test.ts +0 -218
  113. package/src/adapters/mcp/mapper.ts +0 -536
  114. package/src/adapters/mcp/registry.test.ts +0 -433
  115. package/src/adapters/mcp/registry.ts +0 -550
  116. package/src/adapters/mcp/types.ts +0 -258
  117. package/src/adapters/native/filesystem.test.ts +0 -350
  118. package/src/adapters/native/filesystem.ts +0 -393
  119. package/src/adapters/native/github.test.ts +0 -173
  120. package/src/adapters/native/github.ts +0 -627
  121. package/src/adapters/native/index.ts +0 -22
  122. package/src/adapters/native/selector.test.ts +0 -224
  123. package/src/adapters/native/selector.ts +0 -150
  124. package/src/adapters/types.ts +0 -270
  125. package/src/agents/compiler.test.ts +0 -410
  126. package/src/agents/compiler.ts +0 -424
  127. package/src/agents/index.ts +0 -37
  128. package/src/agents/loader.test.ts +0 -319
  129. package/src/agents/loader.ts +0 -143
  130. package/src/agents/resolver.test.ts +0 -282
  131. package/src/agents/resolver.ts +0 -262
  132. package/src/agents/types.ts +0 -97
  133. package/src/cache/index.ts +0 -38
  134. package/src/cache/interfaces.ts +0 -283
  135. package/src/cache/manager.test.ts +0 -266
  136. package/src/cache/manager.ts +0 -388
  137. package/src/cache/provider.test.ts +0 -485
  138. package/src/cache/provider.ts +0 -745
  139. package/src/cache/types.test.ts +0 -192
  140. package/src/cache/types.ts +0 -313
  141. package/src/cli/commands/build.test.ts +0 -248
  142. package/src/cli/commands/build.ts +0 -284
  143. package/src/cli/commands/cache.test.ts +0 -221
  144. package/src/cli/commands/cache.ts +0 -229
  145. package/src/cli/commands/index.ts +0 -63
  146. package/src/cli/commands/init.test.ts +0 -173
  147. package/src/cli/commands/init.ts +0 -296
  148. package/src/cli/commands/skills.test.ts +0 -272
  149. package/src/cli/commands/skills.ts +0 -348
  150. package/src/cli/commands/status.test.ts +0 -392
  151. package/src/cli/commands/status.ts +0 -332
  152. package/src/cli/commands/sync.test.ts +0 -213
  153. package/src/cli/commands/sync.ts +0 -251
  154. package/src/cli/commands/validate.test.ts +0 -216
  155. package/src/cli/commands/validate.ts +0 -340
  156. package/src/cli/index.test.ts +0 -190
  157. package/src/cli/index.ts +0 -493
  158. package/src/commands/context.test.ts +0 -163
  159. package/src/commands/context.ts +0 -111
  160. package/src/commands/index.ts +0 -56
  161. package/src/commands/loader.test.ts +0 -273
  162. package/src/commands/loader.ts +0 -355
  163. package/src/commands/registry.test.ts +0 -384
  164. package/src/commands/registry.ts +0 -248
  165. package/src/commands/runner.test.ts +0 -297
  166. package/src/commands/runner.ts +0 -222
  167. package/src/commands/types.ts +0 -361
  168. package/src/config/index.ts +0 -19
  169. package/src/config/loader.test.ts +0 -262
  170. package/src/config/loader.ts +0 -188
  171. package/src/config/types.ts +0 -154
  172. package/src/context/index.ts +0 -14
  173. package/src/context/loader.test.ts +0 -334
  174. package/src/context/loader.ts +0 -357
  175. package/src/index.test.ts +0 -13
  176. package/src/index.ts +0 -268
  177. package/src/knowledge-library/index.ts +0 -44
  178. package/src/knowledge-library/manager.test.ts +0 -536
  179. package/src/knowledge-library/manager.ts +0 -804
  180. package/src/knowledge-library/types.ts +0 -432
  181. package/src/skills/generator.test.ts +0 -602
  182. package/src/skills/generator.ts +0 -491
  183. package/src/skills/index.ts +0 -27
  184. package/src/skills/templates.ts +0 -520
  185. package/src/skills/types.ts +0 -251
  186. package/templates/completion-report.md +0 -72
  187. package/templates/feedback.md +0 -56
  188. package/templates/project-files/CLAUDE.md.template +0 -109
  189. package/templates/project-files/coreai.json.example +0 -47
  190. package/templates/project-files/mcp.json.template +0 -20
  191. package/templates/review-complete.md +0 -64
  192. package/templates/review-request.md +0 -67
  193. package/templates/task-assignment.md +0 -51
  194. package/tsconfig.build.json +0 -4
  195. package/tsconfig.json +0 -26
  196. package/tsup.config.ts +0 -23
@@ -1,550 +0,0 @@
1
- /**
2
- * MCP Server Registry
3
- *
4
- * Central registry for managing MCP server connections.
5
- * Handles discovery, connection lifecycle, and provides access to connected servers.
6
- */
7
-
8
- import { EventEmitter } from 'events';
9
- import type { McpServerDefinition, McpServerInfo, McpTool, McpResource } from './types.js';
10
- import { McpError } from './types.js';
11
- import type { McpClientOptions } from './client.js';
12
- import { McpClient } from './client.js';
13
- import type { DiscoveryOptions } from './discovery.js';
14
- import { discoverMcpServers } from './discovery.js';
15
- import type { ToolMapping } from './mapper.js';
16
- import { getMappingsForServer, groupMappingsByAdapter } from './mapper.js';
17
-
18
- /**
19
- * Registry entry for a server
20
- */
21
- export interface ServerEntry {
22
- /**
23
- * Server definition from config
24
- */
25
- definition: McpServerDefinition;
26
-
27
- /**
28
- * MCP client instance (null if not connected)
29
- */
30
- client: McpClient | null;
31
-
32
- /**
33
- * Current connection status
34
- */
35
- status: ServerStatus;
36
-
37
- /**
38
- * Server info (available after connection)
39
- */
40
- info: McpServerInfo | null;
41
-
42
- /**
43
- * Available tools (cached after connection)
44
- */
45
- tools: McpTool[];
46
-
47
- /**
48
- * Available resources (cached after connection)
49
- */
50
- resources: McpResource[];
51
-
52
- /**
53
- * Tool mappings for adapter interfaces
54
- */
55
- mappings: ToolMapping[];
56
-
57
- /**
58
- * Last error if connection failed
59
- */
60
- lastError: Error | null;
61
-
62
- /**
63
- * Timestamp of last connection attempt
64
- */
65
- lastAttempt: Date | null;
66
- }
67
-
68
- /**
69
- * Server connection status
70
- */
71
- export type ServerStatus = 'disconnected' | 'connecting' | 'connected' | 'error' | 'disabled';
72
-
73
- /**
74
- * Registry events
75
- */
76
- export interface RegistryEvents {
77
- /**
78
- * Emitted when a server connects
79
- */
80
- serverConnected: (name: string, info: McpServerInfo) => void;
81
-
82
- /**
83
- * Emitted when a server disconnects
84
- */
85
- serverDisconnected: (name: string) => void;
86
-
87
- /**
88
- * Emitted when a server connection fails
89
- */
90
- serverError: (name: string, error: Error) => void;
91
-
92
- /**
93
- * Emitted when server list changes
94
- */
95
- serversChanged: (servers: string[]) => void;
96
- }
97
-
98
- /**
99
- * Options for the registry
100
- */
101
- export interface RegistryOptions {
102
- /**
103
- * Client options to use for all connections
104
- */
105
- clientOptions?: McpClientOptions;
106
-
107
- /**
108
- * Discovery options
109
- */
110
- discoveryOptions?: DiscoveryOptions;
111
-
112
- /**
113
- * Whether to auto-connect on discovery
114
- */
115
- autoConnect?: boolean;
116
-
117
- /**
118
- * Maximum retry attempts for failed connections
119
- */
120
- maxRetries?: number;
121
-
122
- /**
123
- * Delay between retries in milliseconds
124
- */
125
- retryDelay?: number;
126
- }
127
-
128
- const DEFAULT_OPTIONS: Required<RegistryOptions> = {
129
- clientOptions: {},
130
- discoveryOptions: {},
131
- autoConnect: false,
132
- maxRetries: 3,
133
- retryDelay: 1000,
134
- };
135
-
136
- /**
137
- * MCP Server Registry
138
- *
139
- * Manages MCP server connections and provides centralized access to
140
- * connected servers, their tools, and adapter mappings.
141
- */
142
- export class McpRegistry extends EventEmitter {
143
- private servers = new Map<string, ServerEntry>();
144
- private options: Required<RegistryOptions>;
145
-
146
- constructor(options?: RegistryOptions) {
147
- super();
148
- this.options = { ...DEFAULT_OPTIONS, ...options };
149
- }
150
-
151
- /**
152
- * Discover and register MCP servers from config files
153
- */
154
- async discover(): Promise<string[]> {
155
- const definitions = discoverMcpServers(this.options.discoveryOptions);
156
- const registered: string[] = [];
157
-
158
- for (const definition of definitions) {
159
- if (!this.servers.has(definition.name)) {
160
- this.registerServer(definition);
161
- registered.push(definition.name);
162
- }
163
- }
164
-
165
- if (registered.length > 0) {
166
- this.emit('serversChanged', this.getServerNames());
167
- }
168
-
169
- if (this.options.autoConnect) {
170
- await this.connectAll();
171
- }
172
-
173
- return registered;
174
- }
175
-
176
- /**
177
- * Register a server definition manually
178
- */
179
- registerServer(definition: McpServerDefinition): void {
180
- if (this.servers.has(definition.name)) {
181
- throw new McpError(
182
- `Server "${definition.name}" is already registered`,
183
- 'invalid_config',
184
- definition.name
185
- );
186
- }
187
-
188
- const entry: ServerEntry = {
189
- definition,
190
- client: null,
191
- status: definition.enabled === false ? 'disabled' : 'disconnected',
192
- info: null,
193
- tools: [],
194
- resources: [],
195
- mappings: [],
196
- lastError: null,
197
- lastAttempt: null,
198
- };
199
-
200
- this.servers.set(definition.name, entry);
201
- this.emit('serversChanged', this.getServerNames());
202
- }
203
-
204
- /**
205
- * Unregister a server
206
- */
207
- async unregisterServer(name: string): Promise<void> {
208
- const entry = this.servers.get(name);
209
- if (!entry) {
210
- return;
211
- }
212
-
213
- if (entry.status === 'connected' && entry.client) {
214
- await entry.client.disconnect();
215
- }
216
-
217
- this.servers.delete(name);
218
- this.emit('serversChanged', this.getServerNames());
219
- }
220
-
221
- /**
222
- * Connect to a specific server
223
- */
224
- async connect(name: string): Promise<McpServerInfo> {
225
- const entry = this.servers.get(name);
226
- if (!entry) {
227
- throw new McpError(`Server "${name}" is not registered`, 'server_not_found', name);
228
- }
229
-
230
- if (entry.status === 'disabled') {
231
- throw new McpError(`Server "${name}" is disabled`, 'invalid_config', name);
232
- }
233
-
234
- if (entry.status === 'connected' && entry.info) {
235
- return entry.info;
236
- }
237
-
238
- return this.doConnect(entry);
239
- }
240
-
241
- /**
242
- * Disconnect from a specific server
243
- */
244
- async disconnect(name: string): Promise<void> {
245
- const entry = this.servers.get(name);
246
- if (!entry) {
247
- return;
248
- }
249
-
250
- if (entry.client) {
251
- await entry.client.disconnect();
252
- entry.client = null;
253
- }
254
-
255
- entry.status = entry.definition.enabled === false ? 'disabled' : 'disconnected';
256
- entry.info = null;
257
- entry.tools = [];
258
- entry.resources = [];
259
- entry.mappings = [];
260
-
261
- this.emit('serverDisconnected', name);
262
- }
263
-
264
- /**
265
- * Connect to all registered servers
266
- */
267
- async connectAll(): Promise<Map<string, McpServerInfo | Error>> {
268
- const results = new Map<string, McpServerInfo | Error>();
269
-
270
- const promises = Array.from(this.servers.entries())
271
- .filter(([, entry]) => entry.status !== 'disabled')
272
- .map(async ([name]) => {
273
- try {
274
- const info = await this.connect(name);
275
- results.set(name, info);
276
- } catch (error) {
277
- results.set(name, error instanceof Error ? error : new Error(String(error)));
278
- }
279
- });
280
-
281
- await Promise.all(promises);
282
- return results;
283
- }
284
-
285
- /**
286
- * Disconnect from all servers
287
- */
288
- async disconnectAll(): Promise<void> {
289
- const promises = Array.from(this.servers.keys()).map((name) => this.disconnect(name));
290
- await Promise.all(promises);
291
- }
292
-
293
- /**
294
- * Get a connected client by server name
295
- */
296
- getClient(name: string): McpClient | null {
297
- const entry = this.servers.get(name);
298
- return entry?.client ?? null;
299
- }
300
-
301
- /**
302
- * Get server entry by name
303
- */
304
- getServer(name: string): ServerEntry | undefined {
305
- return this.servers.get(name);
306
- }
307
-
308
- /**
309
- * Get all registered server names
310
- */
311
- getServerNames(): string[] {
312
- return Array.from(this.servers.keys());
313
- }
314
-
315
- /**
316
- * Get all connected server names
317
- */
318
- getConnectedServers(): string[] {
319
- return Array.from(this.servers.entries())
320
- .filter(([, entry]) => entry.status === 'connected')
321
- .map(([name]) => name);
322
- }
323
-
324
- /**
325
- * Get all server entries
326
- */
327
- getAllServers(): Map<string, ServerEntry> {
328
- return new Map(this.servers);
329
- }
330
-
331
- /**
332
- * Get tools from a connected server
333
- */
334
- getTools(name: string): McpTool[] {
335
- const entry = this.servers.get(name);
336
- return entry?.tools ?? [];
337
- }
338
-
339
- /**
340
- * Get all tools from all connected servers
341
- */
342
- getAllTools(): Map<string, McpTool[]> {
343
- const result = new Map<string, McpTool[]>();
344
- for (const [name, entry] of this.servers) {
345
- if (entry.status === 'connected' && entry.tools.length > 0) {
346
- result.set(name, entry.tools);
347
- }
348
- }
349
- return result;
350
- }
351
-
352
- /**
353
- * Get tool mappings for a server
354
- */
355
- getMappings(name: string): ToolMapping[] {
356
- const entry = this.servers.get(name);
357
- return entry?.mappings ?? [];
358
- }
359
-
360
- /**
361
- * Get all mappings grouped by adapter type
362
- */
363
- getAllMappingsByAdapter(): Map<string, Map<string, ToolMapping[]>> {
364
- const result = new Map<string, Map<string, ToolMapping[]>>();
365
-
366
- for (const [serverName, entry] of this.servers) {
367
- if (entry.mappings.length > 0) {
368
- const grouped = groupMappingsByAdapter(entry.mappings);
369
- for (const [adapterType, mappings] of grouped) {
370
- let adapterMap = result.get(adapterType);
371
- if (!adapterMap) {
372
- adapterMap = new Map();
373
- result.set(adapterType, adapterMap);
374
- }
375
- adapterMap.set(serverName, mappings);
376
- }
377
- }
378
- }
379
-
380
- return result;
381
- }
382
-
383
- /**
384
- * Find servers that provide a specific adapter type
385
- */
386
- findServersForAdapter(
387
- adapterType: 'issue_tracker' | 'git' | 'documentation' | 'state'
388
- ): string[] {
389
- const servers: string[] = [];
390
-
391
- for (const [name, entry] of this.servers) {
392
- if (entry.status === 'connected') {
393
- const hasAdapter = entry.mappings.some((m) => m.adapterType === adapterType);
394
- if (hasAdapter) {
395
- servers.push(name);
396
- }
397
- }
398
- }
399
-
400
- return servers;
401
- }
402
-
403
- /**
404
- * Call a tool on a connected server
405
- */
406
- async callTool(
407
- serverName: string,
408
- toolName: string,
409
- args?: Record<string, unknown>
410
- ): Promise<unknown> {
411
- const entry = this.servers.get(serverName);
412
- if (!entry) {
413
- throw new McpError(
414
- `Server "${serverName}" is not registered`,
415
- 'server_not_found',
416
- serverName
417
- );
418
- }
419
-
420
- if (entry.status !== 'connected' || !entry.client) {
421
- throw new McpError(
422
- `Server "${serverName}" is not connected`,
423
- 'connection_closed',
424
- serverName
425
- );
426
- }
427
-
428
- return entry.client.callTool(toolName, args);
429
- }
430
-
431
- /**
432
- * Get registry status summary
433
- */
434
- getStatus(): RegistryStatus {
435
- const servers: Record<string, ServerStatusSummary> = {};
436
-
437
- for (const [name, entry] of this.servers) {
438
- const summary: ServerStatusSummary = {
439
- status: entry.status,
440
- toolCount: entry.tools.length,
441
- resourceCount: entry.resources.length,
442
- mappingCount: entry.mappings.length,
443
- };
444
- if (entry.lastError?.message) {
445
- summary.lastError = entry.lastError.message;
446
- }
447
- servers[name] = summary;
448
- }
449
-
450
- return {
451
- totalServers: this.servers.size,
452
- connectedServers: this.getConnectedServers().length,
453
- servers,
454
- };
455
- }
456
-
457
- /**
458
- * Internal: perform connection with retries
459
- */
460
- private async doConnect(entry: ServerEntry, attempt = 1): Promise<McpServerInfo> {
461
- const name = entry.definition.name;
462
- entry.status = 'connecting';
463
- entry.lastAttempt = new Date();
464
-
465
- try {
466
- // Create client if needed
467
- if (!entry.client) {
468
- entry.client = new McpClient(name, entry.definition.config, this.options.clientOptions);
469
- }
470
-
471
- // Connect
472
- await entry.client.connect();
473
-
474
- // Get server info
475
- const info = entry.client.getServerInfo();
476
- if (!info) {
477
- throw new McpError(`Failed to get server info for "${name}"`, 'protocol_error', name);
478
- }
479
-
480
- // Cache tools and resources
481
- if (info.capabilities?.tools) {
482
- entry.tools = await entry.client.listTools();
483
- }
484
- if (info.capabilities?.resources) {
485
- entry.resources = await entry.client.listResources();
486
- }
487
-
488
- // Generate mappings
489
- entry.mappings = getMappingsForServer(name, entry.tools);
490
-
491
- // Update status
492
- entry.status = 'connected';
493
- entry.info = info;
494
- entry.lastError = null;
495
-
496
- this.emit('serverConnected', name, info);
497
- return info;
498
- } catch (error) {
499
- const err = error instanceof Error ? error : new Error(String(error));
500
- entry.lastError = err;
501
-
502
- // Retry if we haven't exceeded max retries
503
- if (attempt < this.options.maxRetries) {
504
- await this.delay(this.options.retryDelay);
505
- return this.doConnect(entry, attempt + 1);
506
- }
507
-
508
- // Mark as error status
509
- entry.status = 'error';
510
- entry.client = null;
511
-
512
- this.emit('serverError', name, err);
513
- throw err;
514
- }
515
- }
516
-
517
- /**
518
- * Internal: delay helper
519
- */
520
- private delay(ms: number): Promise<void> {
521
- return new Promise((resolve) => setTimeout(resolve, ms));
522
- }
523
- }
524
-
525
- /**
526
- * Server status summary
527
- */
528
- export interface ServerStatusSummary {
529
- status: ServerStatus;
530
- toolCount: number;
531
- resourceCount: number;
532
- mappingCount: number;
533
- lastError?: string;
534
- }
535
-
536
- /**
537
- * Registry status
538
- */
539
- export interface RegistryStatus {
540
- totalServers: number;
541
- connectedServers: number;
542
- servers: Record<string, ServerStatusSummary>;
543
- }
544
-
545
- /**
546
- * Create a new registry with default options
547
- */
548
- export function createRegistry(options?: RegistryOptions): McpRegistry {
549
- return new McpRegistry(options);
550
- }