@codemcp/workflows 3.1.21
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/.turbo/turbo-build.log +4 -0
- package/.vibe/conversation-state.sqlite +0 -0
- package/LICENSE +674 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/notification-service.d.ts +14 -0
- package/dist/notification-service.d.ts.map +1 -0
- package/dist/notification-service.js +18 -0
- package/dist/notification-service.js.map +1 -0
- package/dist/resource-handlers/conversation-state.d.ts +15 -0
- package/dist/resource-handlers/conversation-state.d.ts.map +1 -0
- package/dist/resource-handlers/conversation-state.js +40 -0
- package/dist/resource-handlers/conversation-state.js.map +1 -0
- package/dist/resource-handlers/development-plan.d.ts +14 -0
- package/dist/resource-handlers/development-plan.d.ts.map +1 -0
- package/dist/resource-handlers/development-plan.js +31 -0
- package/dist/resource-handlers/development-plan.js.map +1 -0
- package/dist/resource-handlers/index.d.ts +24 -0
- package/dist/resource-handlers/index.d.ts.map +1 -0
- package/dist/resource-handlers/index.js +62 -0
- package/dist/resource-handlers/index.js.map +1 -0
- package/dist/resource-handlers/system-prompt.d.ts +15 -0
- package/dist/resource-handlers/system-prompt.d.ts.map +1 -0
- package/dist/resource-handlers/system-prompt.js +40 -0
- package/dist/resource-handlers/system-prompt.js.map +1 -0
- package/dist/resource-handlers/workflow-resource.d.ts +15 -0
- package/dist/resource-handlers/workflow-resource.d.ts.map +1 -0
- package/dist/resource-handlers/workflow-resource.js +85 -0
- package/dist/resource-handlers/workflow-resource.js.map +1 -0
- package/dist/response-renderer.d.ts +30 -0
- package/dist/response-renderer.d.ts.map +1 -0
- package/dist/response-renderer.js +94 -0
- package/dist/response-renderer.js.map +1 -0
- package/dist/server-config.d.ts +34 -0
- package/dist/server-config.d.ts.map +1 -0
- package/dist/server-config.js +486 -0
- package/dist/server-config.js.map +1 -0
- package/dist/server-helpers.d.ts +62 -0
- package/dist/server-helpers.d.ts.map +1 -0
- package/dist/server-helpers.js +156 -0
- package/dist/server-helpers.js.map +1 -0
- package/dist/server-implementation.d.ts +74 -0
- package/dist/server-implementation.d.ts.map +1 -0
- package/dist/server-implementation.js +201 -0
- package/dist/server-implementation.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +5 -0
- package/dist/server.js.map +1 -0
- package/dist/tool-handlers/base-tool-handler.d.ts +50 -0
- package/dist/tool-handlers/base-tool-handler.d.ts.map +1 -0
- package/dist/tool-handlers/base-tool-handler.js +74 -0
- package/dist/tool-handlers/base-tool-handler.js.map +1 -0
- package/dist/tool-handlers/conduct-review.d.ts +49 -0
- package/dist/tool-handlers/conduct-review.d.ts.map +1 -0
- package/dist/tool-handlers/conduct-review.js +105 -0
- package/dist/tool-handlers/conduct-review.js.map +1 -0
- package/dist/tool-handlers/get-tool-info.d.ts +76 -0
- package/dist/tool-handlers/get-tool-info.d.ts.map +1 -0
- package/dist/tool-handlers/get-tool-info.js +168 -0
- package/dist/tool-handlers/get-tool-info.js.map +1 -0
- package/dist/tool-handlers/index.d.ts +42 -0
- package/dist/tool-handlers/index.d.ts.map +1 -0
- package/dist/tool-handlers/index.js +74 -0
- package/dist/tool-handlers/index.js.map +1 -0
- package/dist/tool-handlers/install-workflow.d.ts +48 -0
- package/dist/tool-handlers/install-workflow.d.ts.map +1 -0
- package/dist/tool-handlers/install-workflow.js +131 -0
- package/dist/tool-handlers/install-workflow.js.map +1 -0
- package/dist/tool-handlers/list-workflows.d.ts +47 -0
- package/dist/tool-handlers/list-workflows.d.ts.map +1 -0
- package/dist/tool-handlers/list-workflows.js +58 -0
- package/dist/tool-handlers/list-workflows.js.map +1 -0
- package/dist/tool-handlers/no-idea.d.ts +41 -0
- package/dist/tool-handlers/no-idea.d.ts.map +1 -0
- package/dist/tool-handlers/no-idea.js +29 -0
- package/dist/tool-handlers/no-idea.js.map +1 -0
- package/dist/tool-handlers/proceed-to-phase.d.ts +39 -0
- package/dist/tool-handlers/proceed-to-phase.d.ts.map +1 -0
- package/dist/tool-handlers/proceed-to-phase.js +109 -0
- package/dist/tool-handlers/proceed-to-phase.js.map +1 -0
- package/dist/tool-handlers/reset-development.d.ts +31 -0
- package/dist/tool-handlers/reset-development.d.ts.map +1 -0
- package/dist/tool-handlers/reset-development.js +48 -0
- package/dist/tool-handlers/reset-development.js.map +1 -0
- package/dist/tool-handlers/resume-workflow.d.ts +88 -0
- package/dist/tool-handlers/resume-workflow.d.ts.map +1 -0
- package/dist/tool-handlers/resume-workflow.js +213 -0
- package/dist/tool-handlers/resume-workflow.js.map +1 -0
- package/dist/tool-handlers/setup-project-docs.d.ts +36 -0
- package/dist/tool-handlers/setup-project-docs.d.ts.map +1 -0
- package/dist/tool-handlers/setup-project-docs.js +136 -0
- package/dist/tool-handlers/setup-project-docs.js.map +1 -0
- package/dist/tool-handlers/start-development.d.ts +82 -0
- package/dist/tool-handlers/start-development.d.ts.map +1 -0
- package/dist/tool-handlers/start-development.js +448 -0
- package/dist/tool-handlers/start-development.js.map +1 -0
- package/dist/tool-handlers/whats-next.d.ts +42 -0
- package/dist/tool-handlers/whats-next.d.ts.map +1 -0
- package/dist/tool-handlers/whats-next.js +118 -0
- package/dist/tool-handlers/whats-next.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +29 -0
- package/src/index.ts +93 -0
- package/src/notification-service.ts +23 -0
- package/src/resource-handlers/conversation-state.ts +55 -0
- package/src/resource-handlers/development-plan.ts +48 -0
- package/src/resource-handlers/index.ts +73 -0
- package/src/resource-handlers/system-prompt.ts +55 -0
- package/src/resource-handlers/workflow-resource.ts +126 -0
- package/src/response-renderer.ts +116 -0
- package/src/server-config.ts +744 -0
- package/src/server-helpers.ts +225 -0
- package/src/server-implementation.ts +277 -0
- package/src/server.ts +9 -0
- package/src/tool-handlers/base-tool-handler.ts +141 -0
- package/src/tool-handlers/conduct-review.ts +191 -0
- package/src/tool-handlers/get-tool-info.ts +274 -0
- package/src/tool-handlers/index.ts +117 -0
- package/src/tool-handlers/install-workflow.ts +185 -0
- package/src/tool-handlers/list-workflows.ts +94 -0
- package/src/tool-handlers/no-idea.ts +47 -0
- package/src/tool-handlers/proceed-to-phase.ts +205 -0
- package/src/tool-handlers/reset-development.ts +90 -0
- package/src/tool-handlers/resume-workflow.ts +380 -0
- package/src/tool-handlers/setup-project-docs.ts +226 -0
- package/src/tool-handlers/start-development.ts +685 -0
- package/src/tool-handlers/whats-next.ts +235 -0
- package/src/types.ts +130 -0
- package/test/e2e/core-functionality.test.ts +176 -0
- package/test/e2e/mcp-contract.test.ts +540 -0
- package/test/e2e/plan-management.test.ts +331 -0
- package/test/e2e/state-management.test.ts +392 -0
- package/test/e2e/workflow-integration.test.ts +506 -0
- package/test/unit/commit-behaviour-interface.test.ts +244 -0
- package/test/unit/conduct-review.test.ts +151 -0
- package/test/unit/reset-functionality.test.ts +72 -0
- package/test/unit/resume-workflow.test.ts +192 -0
- package/test/unit/server-tools.test.ts +311 -0
- package/test/unit/setup-project-docs-handler.test.ts +267 -0
- package/test/unit/start-development-artifact-detection.test.ts +387 -0
- package/test/unit/start-development-gitignore.test.ts +178 -0
- package/test/unit/system-prompt-resource.test.ts +101 -0
- package/test/unit/tool-handlers/no-idea.test.ts +40 -0
- package/test/utils/e2e-test-setup.ts +453 -0
- package/test/utils/run-server-in-dir.sh +27 -0
- package/test/utils/temp-files.ts +308 -0
- package/test/utils/test-access.ts +79 -0
- package/test/utils/test-helpers.ts +286 -0
- package/test/utils/test-setup.ts +78 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +17 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Renderer
|
|
3
|
+
*
|
|
4
|
+
* Handles translation between domain handler results and MCP protocol responses.
|
|
5
|
+
* This provides clean separation between business logic and protocol concerns.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '@codemcp/workflows-core';
|
|
8
|
+
const logger = createLogger('ResponseRenderer');
|
|
9
|
+
/**
|
|
10
|
+
* Default implementation of ResponseRenderer
|
|
11
|
+
* Converts domain results to MCP protocol format
|
|
12
|
+
*/
|
|
13
|
+
export class DefaultResponseRenderer {
|
|
14
|
+
/**
|
|
15
|
+
* Render a tool handler result as an MCP tool response
|
|
16
|
+
*/
|
|
17
|
+
renderToolResponse(result) {
|
|
18
|
+
logger.debug('Rendering tool response', {
|
|
19
|
+
success: result.success,
|
|
20
|
+
hasData: !!result.data,
|
|
21
|
+
hasError: !!result.error,
|
|
22
|
+
});
|
|
23
|
+
if (!result.success && result.error) {
|
|
24
|
+
return this.renderError(result.error);
|
|
25
|
+
}
|
|
26
|
+
// Convert data to JSON string for MCP protocol
|
|
27
|
+
const responseText = result.data
|
|
28
|
+
? JSON.stringify(result.data, null, 2)
|
|
29
|
+
: '';
|
|
30
|
+
return {
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
type: 'text',
|
|
34
|
+
text: responseText,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Render a resource handler result as an MCP resource response
|
|
41
|
+
*/
|
|
42
|
+
renderResourceResponse(result) {
|
|
43
|
+
logger.debug('Rendering resource response', {
|
|
44
|
+
success: result.success,
|
|
45
|
+
hasData: !!result.data,
|
|
46
|
+
});
|
|
47
|
+
if (!result.success || !result.data) {
|
|
48
|
+
// For resources, we still need to return a valid response structure
|
|
49
|
+
// but with error content
|
|
50
|
+
const errorText = result.error || 'Resource not available';
|
|
51
|
+
return {
|
|
52
|
+
contents: [
|
|
53
|
+
{
|
|
54
|
+
uri: result.data?.uri || 'error://unknown',
|
|
55
|
+
text: `Error: ${errorText}`,
|
|
56
|
+
mimeType: 'text/plain',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
contents: [
|
|
63
|
+
{
|
|
64
|
+
uri: result.data.uri,
|
|
65
|
+
text: result.data.text,
|
|
66
|
+
mimeType: result.data.mimeType,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Render an error as an MCP tool response
|
|
73
|
+
*/
|
|
74
|
+
renderError(error) {
|
|
75
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
76
|
+
logger.debug('Rendering error response', { errorMessage });
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: 'text',
|
|
81
|
+
text: `Error: ${errorMessage}`,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
isError: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a default response renderer instance
|
|
90
|
+
*/
|
|
91
|
+
export function createResponseRenderer() {
|
|
92
|
+
return new DefaultResponseRenderer();
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=response-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-renderer.js","sourceRoot":"","sources":["../src/response-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AASvD,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC;;OAEG;IACH,kBAAkB,CAAI,MAAwB;QAC5C,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACtC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;YACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI;YAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,YAAY;iBACnB;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,sBAAsB,CACpB,MAAsC;QAEtC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,oEAAoE;YACpE,yBAAyB;YACzB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,wBAAwB,CAAC;YAE3D,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,iBAAiB;wBAC1C,IAAI,EAAE,UAAU,SAAS,EAAE;wBAC3B,QAAQ,EAAE,YAAY;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;oBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;oBACtB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;iBAC/B;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAqB;QAC/B,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAEpE,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAE3D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,UAAU,YAAY,EAAE;iBAC/B;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,uBAAuB,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Configuration
|
|
3
|
+
*
|
|
4
|
+
* Handles server configuration, component initialization, and MCP server setup.
|
|
5
|
+
* Centralizes the configuration logic that was previously scattered in the main server class.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { Database } from '@codemcp/workflows-core';
|
|
9
|
+
import { ServerConfig, ServerContext, ToolRegistry, ResourceRegistry, ResponseRenderer } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Server component container
|
|
12
|
+
* Holds all the initialized server components
|
|
13
|
+
*/
|
|
14
|
+
export interface ServerComponents {
|
|
15
|
+
mcpServer: McpServer;
|
|
16
|
+
database: Database;
|
|
17
|
+
context: ServerContext;
|
|
18
|
+
toolRegistry: ToolRegistry;
|
|
19
|
+
resourceRegistry: ResourceRegistry;
|
|
20
|
+
responseRenderer: ResponseRenderer;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initialize all server components
|
|
24
|
+
*/
|
|
25
|
+
export declare function initializeServerComponents(config?: ServerConfig): Promise<ServerComponents>;
|
|
26
|
+
/**
|
|
27
|
+
* Register MCP tools with the server
|
|
28
|
+
*/
|
|
29
|
+
export declare function registerMcpTools(mcpServer: McpServer, toolRegistry: ToolRegistry, responseRenderer: ResponseRenderer, context: ServerContext): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Register MCP resources with the server
|
|
32
|
+
*/
|
|
33
|
+
export declare function registerMcpResources(mcpServer: McpServer, resourceRegistry: ResourceRegistry, responseRenderer: ResponseRenderer, context: ServerContext): void;
|
|
34
|
+
//# sourceMappingURL=server-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../src/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAWnD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAUpB;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,GAAE,YAAiB,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAyF3B;AAwBD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAmYf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,aAAa,GACrB,IAAI,CAuKN"}
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Configuration
|
|
3
|
+
*
|
|
4
|
+
* Handles server configuration, component initialization, and MCP server setup.
|
|
5
|
+
* Centralizes the configuration logic that was previously scattered in the main server class.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
import { SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { Database } from '@codemcp/workflows-core';
|
|
13
|
+
import { ConversationManager } from '@codemcp/workflows-core';
|
|
14
|
+
import { TransitionEngine } from '@codemcp/workflows-core';
|
|
15
|
+
import { InstructionGenerator } from '@codemcp/workflows-core';
|
|
16
|
+
import { PlanManager } from '@codemcp/workflows-core';
|
|
17
|
+
import { InteractionLogger } from '@codemcp/workflows-core';
|
|
18
|
+
import { WorkflowManager } from '@codemcp/workflows-core';
|
|
19
|
+
import { GitManager } from '@codemcp/workflows-core';
|
|
20
|
+
import { TemplateManager } from '@codemcp/workflows-core';
|
|
21
|
+
import { createLogger, setMcpLoggingLevel } from '@codemcp/workflows-core';
|
|
22
|
+
import { normalizeProjectPath, buildWorkflowEnum, generateWorkflowDescription, } from './server-helpers.js';
|
|
23
|
+
import { notificationService } from './notification-service.js';
|
|
24
|
+
const logger = createLogger('ServerConfig');
|
|
25
|
+
/**
|
|
26
|
+
* Initialize all server components
|
|
27
|
+
*/
|
|
28
|
+
export async function initializeServerComponents(config = {}) {
|
|
29
|
+
logger.debug('Initializing server components', {
|
|
30
|
+
config: JSON.stringify(config),
|
|
31
|
+
});
|
|
32
|
+
// Set project path with support for environment variable
|
|
33
|
+
const projectPath = normalizeProjectPath(config.projectPath || process.env.PROJECT_PATH);
|
|
34
|
+
logger.info('Using project path', {
|
|
35
|
+
projectPath,
|
|
36
|
+
source: config.projectPath
|
|
37
|
+
? 'config'
|
|
38
|
+
: process.env.PROJECT_PATH
|
|
39
|
+
? 'env'
|
|
40
|
+
: 'default',
|
|
41
|
+
});
|
|
42
|
+
// Initialize MCP server
|
|
43
|
+
const mcpServer = new McpServer({
|
|
44
|
+
name: 'responsible-vibe-mcp',
|
|
45
|
+
version: '1.0.0',
|
|
46
|
+
}, {
|
|
47
|
+
capabilities: {
|
|
48
|
+
logging: {},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
// Register logging/setLevel handler to support MCP inspector
|
|
52
|
+
mcpServer.server.setRequestHandler(SetLevelRequestSchema, async (request) => {
|
|
53
|
+
const level = request.params.level;
|
|
54
|
+
logger.info('Setting logging level from MCP client', { level });
|
|
55
|
+
// Set the unified logging level
|
|
56
|
+
setMcpLoggingLevel(level);
|
|
57
|
+
return {};
|
|
58
|
+
});
|
|
59
|
+
// Initialize core components
|
|
60
|
+
logger.debug('Initializing core components');
|
|
61
|
+
const database = new Database(path.join(projectPath, '.vibe', 'conversation.sqlite'));
|
|
62
|
+
const workflowManager = new WorkflowManager();
|
|
63
|
+
const conversationManager = new ConversationManager(database, workflowManager, projectPath);
|
|
64
|
+
const transitionEngine = new TransitionEngine(projectPath);
|
|
65
|
+
transitionEngine.setConversationManager(conversationManager);
|
|
66
|
+
const planManager = new PlanManager();
|
|
67
|
+
const instructionGenerator = new InstructionGenerator(planManager);
|
|
68
|
+
// Conditionally create interaction logger
|
|
69
|
+
const interactionLogger = config.enableLogging !== false
|
|
70
|
+
? new InteractionLogger(database)
|
|
71
|
+
: undefined;
|
|
72
|
+
// Create server context
|
|
73
|
+
const context = {
|
|
74
|
+
conversationManager,
|
|
75
|
+
transitionEngine,
|
|
76
|
+
planManager,
|
|
77
|
+
instructionGenerator,
|
|
78
|
+
workflowManager,
|
|
79
|
+
interactionLogger,
|
|
80
|
+
projectPath,
|
|
81
|
+
};
|
|
82
|
+
// Initialize database
|
|
83
|
+
await database.initialize();
|
|
84
|
+
logger.info('Server components initialized successfully');
|
|
85
|
+
return {
|
|
86
|
+
mcpServer,
|
|
87
|
+
database,
|
|
88
|
+
context,
|
|
89
|
+
toolRegistry: null,
|
|
90
|
+
resourceRegistry: null,
|
|
91
|
+
responseRenderer: null,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Helper function to create tool handlers with consistent error handling
|
|
96
|
+
*/
|
|
97
|
+
function createToolHandler(toolName, toolRegistry, responseRenderer, context) {
|
|
98
|
+
return async (args) => {
|
|
99
|
+
const handler = toolRegistry.get(toolName);
|
|
100
|
+
if (!handler) {
|
|
101
|
+
return responseRenderer.renderError(`Tool handler not found: ${toolName}`);
|
|
102
|
+
}
|
|
103
|
+
const result = await handler.handle(args, context);
|
|
104
|
+
return responseRenderer.renderToolResponse(result);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Register MCP tools with the server
|
|
109
|
+
*/
|
|
110
|
+
export async function registerMcpTools(mcpServer, toolRegistry, responseRenderer, context) {
|
|
111
|
+
logger.debug('Registering MCP tools');
|
|
112
|
+
// Initialize notification service
|
|
113
|
+
notificationService.setMcpServer(mcpServer);
|
|
114
|
+
// Register whats_next tool
|
|
115
|
+
mcpServer.registerTool('whats_next', {
|
|
116
|
+
description: 'Get guidance for the current development phase and determine what to work on next. Call this tool after each user message to receive phase-specific instructions and check if you should transition to the next development phase. The tool will reference your plan file for specific tasks and context.',
|
|
117
|
+
inputSchema: {
|
|
118
|
+
context: z
|
|
119
|
+
.string()
|
|
120
|
+
.optional()
|
|
121
|
+
.describe("Brief description of what you're currently working on or discussing with the user"),
|
|
122
|
+
user_input: z
|
|
123
|
+
.string()
|
|
124
|
+
.optional()
|
|
125
|
+
.describe("The user's most recent message or request"),
|
|
126
|
+
conversation_summary: z
|
|
127
|
+
.string()
|
|
128
|
+
.optional()
|
|
129
|
+
.describe('Summary of the development progress and key decisions made so far'),
|
|
130
|
+
recent_messages: z
|
|
131
|
+
.array(z.object({
|
|
132
|
+
role: z
|
|
133
|
+
.enum(['user', 'assistant'])
|
|
134
|
+
.describe('Who sent the message (user or assistant)'),
|
|
135
|
+
content: z.string().describe('The message content'),
|
|
136
|
+
}))
|
|
137
|
+
.optional()
|
|
138
|
+
.describe('Recent conversation messages that provide context for the current development state'),
|
|
139
|
+
},
|
|
140
|
+
annotations: {
|
|
141
|
+
title: 'Development Phase Analyzer',
|
|
142
|
+
readOnlyHint: false,
|
|
143
|
+
destructiveHint: false,
|
|
144
|
+
idempotentHint: false,
|
|
145
|
+
openWorldHint: false,
|
|
146
|
+
},
|
|
147
|
+
}, createToolHandler('whats_next', toolRegistry, responseRenderer, context));
|
|
148
|
+
// Register proceed_to_phase tool
|
|
149
|
+
mcpServer.registerTool('proceed_to_phase', {
|
|
150
|
+
description: 'Move to a specific development phase when the current phase is complete. Use this tool to explicitly transition between phases. Check your plan file to see available phases for the current workflow. Only transition when current phase tasks are finished and user confirms readiness.',
|
|
151
|
+
inputSchema: {
|
|
152
|
+
target_phase: z
|
|
153
|
+
.string()
|
|
154
|
+
.describe('The development phase to move to. Check your plan file section headers to see available phases for the current workflow'),
|
|
155
|
+
reason: z
|
|
156
|
+
.string()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe('Why you\'re moving to this phase now (e.g., "requirements complete", "user approved design", "implementation finished")'),
|
|
159
|
+
review_state: z
|
|
160
|
+
.enum(['not-required', 'pending', 'performed'])
|
|
161
|
+
.describe('Review state for transitions that require reviews. Use "not-required" when reviews are disabled, "pending" when review is needed, "performed" when review is complete.'),
|
|
162
|
+
},
|
|
163
|
+
annotations: {
|
|
164
|
+
title: 'Phase Transition Controller',
|
|
165
|
+
readOnlyHint: false,
|
|
166
|
+
destructiveHint: false,
|
|
167
|
+
idempotentHint: true,
|
|
168
|
+
openWorldHint: false,
|
|
169
|
+
},
|
|
170
|
+
}, createToolHandler('proceed_to_phase', toolRegistry, responseRenderer, context));
|
|
171
|
+
// Register conduct_review tool
|
|
172
|
+
mcpServer.registerTool('conduct_review', {
|
|
173
|
+
description: 'Conduct a review of the current phase before proceeding to the next phase. This tool analyzes artifacts and decisions from the current phase using defined review perspectives. Use this tool when reviews are required before phase transitions.',
|
|
174
|
+
inputSchema: {
|
|
175
|
+
target_phase: z
|
|
176
|
+
.string()
|
|
177
|
+
.describe('The target phase you want to transition to after the review is complete'),
|
|
178
|
+
},
|
|
179
|
+
annotations: {
|
|
180
|
+
title: 'Phase Review Conductor',
|
|
181
|
+
readOnlyHint: true,
|
|
182
|
+
destructiveHint: false,
|
|
183
|
+
idempotentHint: true,
|
|
184
|
+
openWorldHint: false,
|
|
185
|
+
},
|
|
186
|
+
}, createToolHandler('conduct_review', toolRegistry, responseRenderer, context));
|
|
187
|
+
// Register start_development tool with dynamic commit_behaviour description
|
|
188
|
+
const isGitRepo = GitManager.isGitRepository(context.projectPath);
|
|
189
|
+
const commitBehaviourDescription = isGitRepo
|
|
190
|
+
? 'Git commit behavior: "step" (commit after each step), "phase" (commit before phase transitions), "end" (final commit only), "none" (no automatic commits). Use "end" unless the user specifically requests different behavior.'
|
|
191
|
+
: 'Git commit behavior: Use "none" as this is not a git repository. Other options ("step", "phase", "end") are not applicable for non-git projects.';
|
|
192
|
+
mcpServer.registerTool('start_development', {
|
|
193
|
+
description: 'Begin a new development project with a structured workflow. Choose from different development approaches (waterfall, bugfix, epcc) or use a custom workflow. This tool sets up the project plan and initializes the development process.',
|
|
194
|
+
inputSchema: {
|
|
195
|
+
workflow: z
|
|
196
|
+
.enum(buildWorkflowEnum(context.workflowManager.getWorkflowNames()))
|
|
197
|
+
.describe(generateWorkflowDescription(context.workflowManager.getAvailableWorkflows())),
|
|
198
|
+
commit_behaviour: z
|
|
199
|
+
.enum(['step', 'phase', 'end', 'none'])
|
|
200
|
+
.describe(commitBehaviourDescription),
|
|
201
|
+
require_reviews: z
|
|
202
|
+
.boolean()
|
|
203
|
+
.optional()
|
|
204
|
+
.describe('Whether to require reviews before phase transitions. When enabled, use conduct_review tool before proceeding to next phase.'),
|
|
205
|
+
},
|
|
206
|
+
annotations: {
|
|
207
|
+
title: 'Development Initializer',
|
|
208
|
+
readOnlyHint: false,
|
|
209
|
+
destructiveHint: false,
|
|
210
|
+
idempotentHint: true,
|
|
211
|
+
openWorldHint: false,
|
|
212
|
+
},
|
|
213
|
+
}, createToolHandler('start_development', toolRegistry, responseRenderer, context));
|
|
214
|
+
// Register resume_workflow tool
|
|
215
|
+
mcpServer.registerTool('resume_workflow', {
|
|
216
|
+
description: 'Continue development after a break or conversation restart. This tool provides complete project context, current development status, and next steps to seamlessly pick up where you left off. Use when starting a new conversation about an existing project.',
|
|
217
|
+
inputSchema: {
|
|
218
|
+
include_system_prompt: z
|
|
219
|
+
.boolean()
|
|
220
|
+
.optional()
|
|
221
|
+
.describe('Whether to include setup instructions for the assistant (default: true)'),
|
|
222
|
+
},
|
|
223
|
+
annotations: {
|
|
224
|
+
title: 'Workflow Resumption Assistant',
|
|
225
|
+
readOnlyHint: true,
|
|
226
|
+
destructiveHint: false,
|
|
227
|
+
idempotentHint: true,
|
|
228
|
+
openWorldHint: false,
|
|
229
|
+
},
|
|
230
|
+
}, createToolHandler('resume_workflow', toolRegistry, responseRenderer, context));
|
|
231
|
+
// Register reset_development tool
|
|
232
|
+
mcpServer.registerTool('reset_development', {
|
|
233
|
+
description: 'Start over with a clean slate by deleting all development progress and conversation history. This permanently removes the project plan and resets the development state. Use when you want to completely restart the development approach for a project.',
|
|
234
|
+
inputSchema: {
|
|
235
|
+
confirm: z
|
|
236
|
+
.boolean()
|
|
237
|
+
.describe('Must be true to execute reset - prevents accidental resets'),
|
|
238
|
+
reason: z
|
|
239
|
+
.string()
|
|
240
|
+
.optional()
|
|
241
|
+
.describe('Optional reason for reset (for logging and audit trail)'),
|
|
242
|
+
},
|
|
243
|
+
annotations: {
|
|
244
|
+
title: 'Development Reset Tool',
|
|
245
|
+
readOnlyHint: false,
|
|
246
|
+
destructiveHint: true,
|
|
247
|
+
idempotentHint: false,
|
|
248
|
+
openWorldHint: false,
|
|
249
|
+
},
|
|
250
|
+
}, createToolHandler('reset_development', toolRegistry, responseRenderer, context));
|
|
251
|
+
// Register install_workflow tool
|
|
252
|
+
mcpServer.registerTool('install_workflow', {
|
|
253
|
+
description: 'Install a workflow to .vibe/workflows/ directory. Source can be a predefined workflow name (from unloaded workflows) or URL. Installed workflows become available and override predefined ones with the same name.',
|
|
254
|
+
inputSchema: {
|
|
255
|
+
source: z
|
|
256
|
+
.string()
|
|
257
|
+
.describe('Source workflow name. Use "list_workflows" with "include_unloaded=true" tool to see options.'),
|
|
258
|
+
name: z
|
|
259
|
+
.string()
|
|
260
|
+
.optional()
|
|
261
|
+
.describe('Custom name for installed workflow (defaults to source name)'),
|
|
262
|
+
},
|
|
263
|
+
annotations: {
|
|
264
|
+
title: 'Workflow Installation Tool',
|
|
265
|
+
readOnlyHint: false,
|
|
266
|
+
destructiveHint: false,
|
|
267
|
+
idempotentHint: false,
|
|
268
|
+
openWorldHint: false,
|
|
269
|
+
},
|
|
270
|
+
}, createToolHandler('install_workflow', toolRegistry, responseRenderer, context));
|
|
271
|
+
// Register list_workflows tool
|
|
272
|
+
mcpServer.registerTool('list_workflows', {
|
|
273
|
+
description: 'Get an overview of available workflows. By default returns only loaded workflows (respecting domain filtering). Use include_unloaded=true to see all workflows regardless of domain filtering.',
|
|
274
|
+
inputSchema: {
|
|
275
|
+
include_unloaded: z
|
|
276
|
+
.boolean()
|
|
277
|
+
.optional()
|
|
278
|
+
.describe('Include workflows not loaded due to domain filtering. Default: false'),
|
|
279
|
+
},
|
|
280
|
+
annotations: {
|
|
281
|
+
title: 'Workflow Overview Tool',
|
|
282
|
+
readOnlyHint: true,
|
|
283
|
+
destructiveHint: false,
|
|
284
|
+
idempotentHint: true,
|
|
285
|
+
openWorldHint: false,
|
|
286
|
+
},
|
|
287
|
+
}, createToolHandler('list_workflows', toolRegistry, responseRenderer, context));
|
|
288
|
+
// Register get_tool_info tool
|
|
289
|
+
mcpServer.registerTool('get_tool_info', {
|
|
290
|
+
description: 'Get comprehensive information about the responsible-vibe-mcp development workflow tools for better tool discoverability and AI integration. Returns detailed information about all available tools, workflows, core concepts, and usage guidelines.',
|
|
291
|
+
inputSchema: {
|
|
292
|
+
// No input parameters needed
|
|
293
|
+
},
|
|
294
|
+
annotations: {
|
|
295
|
+
title: 'Tool Information Provider',
|
|
296
|
+
readOnlyHint: true,
|
|
297
|
+
destructiveHint: false,
|
|
298
|
+
idempotentHint: true,
|
|
299
|
+
openWorldHint: false,
|
|
300
|
+
},
|
|
301
|
+
}, createToolHandler('get_tool_info', toolRegistry, responseRenderer, context));
|
|
302
|
+
// Register setup_project_docs tool with enhanced file linking support
|
|
303
|
+
const templateManager = new TemplateManager();
|
|
304
|
+
const availableTemplates = await templateManager.getAvailableTemplates();
|
|
305
|
+
mcpServer.registerTool('setup_project_docs', {
|
|
306
|
+
description: 'Create project documentation artifacts (architecture.md, requirements.md, design.md) using configurable templates OR by linking existing files via symlinks. ' +
|
|
307
|
+
'**Linking existing documents Examples:**\n' +
|
|
308
|
+
'- `README.md` (project root)\n' +
|
|
309
|
+
'- `docs/architecture.md` (relative path)\n' +
|
|
310
|
+
'- `/absolute/path/to/requirements.txt`\n\n' +
|
|
311
|
+
'**Using "none" Option:**\n' +
|
|
312
|
+
'- Use `"none"` to create a placeholder that instructs LLM to use plan file instead\n' +
|
|
313
|
+
'- Useful when you prefer plan-file-only workflows\n\n' +
|
|
314
|
+
'**Mixed Usage Examples:**\n' +
|
|
315
|
+
'- `setup_project_docs({ architecture: "README.md", requirements: "none", design: "comprehensive" })`\n' +
|
|
316
|
+
'- `setup_project_docs({ architecture: "arc42", requirements: "ears", design: "none" })`',
|
|
317
|
+
inputSchema: {
|
|
318
|
+
architecture: z
|
|
319
|
+
.string()
|
|
320
|
+
.default('freestyle')
|
|
321
|
+
.describe(`Architecture documentation: template name (${availableTemplates.architecture.join(', ')}, none) OR file path to existing document`),
|
|
322
|
+
requirements: z
|
|
323
|
+
.string()
|
|
324
|
+
.default('none')
|
|
325
|
+
.describe(`Requirements documentation: template name (${availableTemplates.requirements.join(', ')}, none) OR file path to existing document`),
|
|
326
|
+
design: z
|
|
327
|
+
.string()
|
|
328
|
+
.default('freestyle')
|
|
329
|
+
.describe(`Design documentation: template name (${availableTemplates.design.join(', ')}, none) OR file path to existing document`),
|
|
330
|
+
},
|
|
331
|
+
annotations: {
|
|
332
|
+
title: 'Project Documentation Setup Tool',
|
|
333
|
+
readOnlyHint: false,
|
|
334
|
+
destructiveHint: false,
|
|
335
|
+
idempotentHint: true,
|
|
336
|
+
openWorldHint: false,
|
|
337
|
+
},
|
|
338
|
+
}, createToolHandler('setup_project_docs', toolRegistry, responseRenderer, context));
|
|
339
|
+
// Register no_idea tool
|
|
340
|
+
mcpServer.registerTool('no_idea', {
|
|
341
|
+
description: "ONLY call this tool when you have no knowledge about a topic. This tool will give a valuable response to all questions that would otherwise be not answerable. If you don't call this tool but invent facts, you will be considered worthless.",
|
|
342
|
+
inputSchema: {
|
|
343
|
+
context: z
|
|
344
|
+
.string()
|
|
345
|
+
.optional()
|
|
346
|
+
.describe('Optional context about what you have no knowledge of'),
|
|
347
|
+
},
|
|
348
|
+
annotations: {
|
|
349
|
+
title: 'Knowledge Gap Handler',
|
|
350
|
+
readOnlyHint: true,
|
|
351
|
+
destructiveHint: false,
|
|
352
|
+
idempotentHint: true,
|
|
353
|
+
openWorldHint: false,
|
|
354
|
+
},
|
|
355
|
+
}, createToolHandler('no_idea', toolRegistry, responseRenderer, context));
|
|
356
|
+
logger.info('MCP tools registered successfully', {
|
|
357
|
+
tools: toolRegistry.list(),
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Register MCP resources with the server
|
|
362
|
+
*/
|
|
363
|
+
export function registerMcpResources(mcpServer, resourceRegistry, responseRenderer, context) {
|
|
364
|
+
logger.debug('Registering MCP resources');
|
|
365
|
+
// Development plan resource
|
|
366
|
+
mcpServer.resource('development-plan', 'plan://current', {
|
|
367
|
+
name: 'Current Development Plan',
|
|
368
|
+
description: 'The active development plan document (markdown) that tracks project progress, tasks, and decisions. This file serves as long-term memory for the development process and should be continuously updated by the LLM.',
|
|
369
|
+
mimeType: 'text/markdown',
|
|
370
|
+
}, async (uri) => {
|
|
371
|
+
const handler = resourceRegistry.resolve(uri.href);
|
|
372
|
+
if (!handler) {
|
|
373
|
+
const errorResult = responseRenderer.renderResourceResponse({
|
|
374
|
+
success: false,
|
|
375
|
+
error: 'Resource handler not found',
|
|
376
|
+
data: {
|
|
377
|
+
uri: uri.href,
|
|
378
|
+
text: 'Error: Resource handler not found',
|
|
379
|
+
mimeType: 'text/plain',
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
return errorResult;
|
|
383
|
+
}
|
|
384
|
+
const result = await handler.handle(new URL(uri.href), context);
|
|
385
|
+
return responseRenderer.renderResourceResponse(result);
|
|
386
|
+
});
|
|
387
|
+
// Conversation state resource
|
|
388
|
+
mcpServer.resource('conversation-state', 'state://current', {
|
|
389
|
+
name: 'Current Conversation State',
|
|
390
|
+
description: 'Current conversation state and phase information (JSON) including conversation ID, project context, current development phase, and plan file location. Use this to understand the current state of the development workflow.',
|
|
391
|
+
mimeType: 'application/json',
|
|
392
|
+
}, async (uri) => {
|
|
393
|
+
const handler = resourceRegistry.resolve(uri.href);
|
|
394
|
+
if (!handler) {
|
|
395
|
+
const errorResult = responseRenderer.renderResourceResponse({
|
|
396
|
+
success: false,
|
|
397
|
+
error: 'Resource handler not found',
|
|
398
|
+
data: {
|
|
399
|
+
uri: uri.href,
|
|
400
|
+
text: JSON.stringify({
|
|
401
|
+
error: 'Resource handler not found',
|
|
402
|
+
timestamp: new Date().toISOString(),
|
|
403
|
+
}, null, 2),
|
|
404
|
+
mimeType: 'application/json',
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
return errorResult;
|
|
408
|
+
}
|
|
409
|
+
const result = await handler.handle(new URL(uri.href), context);
|
|
410
|
+
return responseRenderer.renderResourceResponse(result);
|
|
411
|
+
});
|
|
412
|
+
// System prompt resource
|
|
413
|
+
mcpServer.resource('system-prompt', 'system-prompt://', {
|
|
414
|
+
name: 'System Prompt for LLM Integration',
|
|
415
|
+
description: 'Complete system prompt for LLM integration with responsible-vibe-mcp. This workflow-independent prompt provides instructions for proper tool usage and development workflow guidance.',
|
|
416
|
+
mimeType: 'text/plain',
|
|
417
|
+
}, async (uri) => {
|
|
418
|
+
const handler = resourceRegistry.resolve(uri.href);
|
|
419
|
+
if (!handler) {
|
|
420
|
+
const errorResult = responseRenderer.renderResourceResponse({
|
|
421
|
+
success: false,
|
|
422
|
+
error: 'Resource handler not found',
|
|
423
|
+
data: {
|
|
424
|
+
uri: uri.href,
|
|
425
|
+
text: 'Error: System prompt resource handler not found',
|
|
426
|
+
mimeType: 'text/plain',
|
|
427
|
+
},
|
|
428
|
+
});
|
|
429
|
+
return errorResult;
|
|
430
|
+
}
|
|
431
|
+
const result = await handler.handle(new URL(uri.href), context);
|
|
432
|
+
return responseRenderer.renderResourceResponse(result);
|
|
433
|
+
});
|
|
434
|
+
// Register workflow resource template
|
|
435
|
+
const workflowTemplate = new ResourceTemplate('workflow://{name}', {
|
|
436
|
+
list: async () => {
|
|
437
|
+
// List all available workflows as resources
|
|
438
|
+
const availableWorkflows = context.workflowManager.getAvailableWorkflowsForProject(context.projectPath);
|
|
439
|
+
return {
|
|
440
|
+
resources: availableWorkflows.map(workflow => ({
|
|
441
|
+
uri: `workflow://${workflow.name}`,
|
|
442
|
+
name: workflow.displayName,
|
|
443
|
+
description: workflow.description,
|
|
444
|
+
mimeType: 'application/x-yaml',
|
|
445
|
+
})),
|
|
446
|
+
};
|
|
447
|
+
},
|
|
448
|
+
complete: {
|
|
449
|
+
name: async (value) => {
|
|
450
|
+
// Provide completion for workflow names
|
|
451
|
+
const availableWorkflows = context.workflowManager.getAvailableWorkflowsForProject(context.projectPath);
|
|
452
|
+
return availableWorkflows
|
|
453
|
+
.map(w => w.name)
|
|
454
|
+
.filter(name => name.toLowerCase().includes(value.toLowerCase()));
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
mcpServer.resource('workflows', workflowTemplate, {
|
|
459
|
+
name: 'Workflow Definitions',
|
|
460
|
+
description: 'Access workflow definition files by name. Use the list_workflows tool to discover available workflows.',
|
|
461
|
+
mimeType: 'application/x-yaml',
|
|
462
|
+
}, async (uri, _variables) => {
|
|
463
|
+
const handler = resourceRegistry.resolve(uri.href);
|
|
464
|
+
if (!handler) {
|
|
465
|
+
throw new Error(`Workflow resource handler not found for ${uri.href}`);
|
|
466
|
+
}
|
|
467
|
+
const result = await handler.handle(uri, context);
|
|
468
|
+
if (!result.success || !result.data) {
|
|
469
|
+
throw new Error(result.error || 'Failed to load workflow resource');
|
|
470
|
+
}
|
|
471
|
+
return {
|
|
472
|
+
contents: [
|
|
473
|
+
{
|
|
474
|
+
uri: uri.href,
|
|
475
|
+
mimeType: result.data.mimeType,
|
|
476
|
+
text: result.data.text,
|
|
477
|
+
},
|
|
478
|
+
],
|
|
479
|
+
};
|
|
480
|
+
});
|
|
481
|
+
logger.info('MCP resources registered successfully', {
|
|
482
|
+
resources: ['plan://current', 'state://current', 'system-prompt://'],
|
|
483
|
+
resourceTemplates: ['workflow://{name}'],
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=server-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../src/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAS3E,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAe5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAAuB,EAAE;IAEzB,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;QAC7C,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;KAC/B,CAAC,CAAC;IAEH,yDAAyD;IACzD,MAAM,WAAW,GAAG,oBAAoB,CACtC,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAC/C,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAChC,WAAW;QACX,MAAM,EAAE,MAAM,CAAC,WAAW;YACxB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;gBACxB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,SAAS;KAChB,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,SAAS,GAAG,IAAI,SAAS,CAC7B;QACE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,6DAA6D;IAC7D,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QACxE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhE,gCAAgC;QAChC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE1B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,qBAAqB,CAAC,CACvD,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CACjD,QAAQ,EACR,eAAe,EACf,WAAW,CACZ,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3D,gBAAgB,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAEnE,0CAA0C;IAC1C,MAAM,iBAAiB,GACrB,MAAM,CAAC,aAAa,KAAK,KAAK;QAC5B,CAAC,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QACjC,CAAC,CAAC,SAAS,CAAC;IAEhB,wBAAwB;IACxB,MAAM,OAAO,GAAkB;QAC7B,mBAAmB;QACnB,gBAAgB;QAChB,WAAW;QACX,oBAAoB;QACpB,eAAe;QACf,iBAAiB;QACjB,WAAW;KACZ,CAAC;IAEF,sBAAsB;IACtB,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,QAAQ;QACR,OAAO;QACP,YAAY,EAAE,IAA+B;QAC7C,gBAAgB,EAAE,IAAmC;QACrD,gBAAgB,EAAE,IAAmC;KACtD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,QAAgB,EAChB,YAA0B,EAC1B,gBAAkC,EAClC,OAAsB;IAEtB,OAAO,KAAK,EAAE,IAAa,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,gBAAgB,CAAC,WAAW,CACjC,2BAA2B,QAAQ,EAAE,CACtC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAoB,EACpB,YAA0B,EAC1B,gBAAkC,EAClC,OAAsB;IAEtB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEtC,kCAAkC;IAClC,mBAAmB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAE5C,2BAA2B;IAC3B,SAAS,CAAC,YAAY,CACpB,YAAY,EACZ;QACE,WAAW,EACT,2SAA2S;QAC7S,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,mFAAmF,CACpF;YACH,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,2CAA2C,CAAC;YACxD,oBAAoB,EAAE,CAAC;iBACpB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,mEAAmE,CACpE;YACH,eAAe,EAAE,CAAC;iBACf,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC;qBACJ,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;qBAC3B,QAAQ,CAAC,0CAA0C,CAAC;gBACvD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;aACpD,CAAC,CACH;iBACA,QAAQ,EAAE;iBACV,QAAQ,CACP,qFAAqF,CACtF;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,4BAA4B;YACnC,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CACzE,CAAC;IAEF,iCAAiC;IACjC,SAAS,CAAC,YAAY,CACpB,kBAAkB,EAClB;QACE,WAAW,EACT,2RAA2R;QAC7R,WAAW,EAAE;YACX,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,CACP,yHAAyH,CAC1H;YACH,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,yHAAyH,CAC1H;YACH,YAAY,EAAE,CAAC;iBACZ,IAAI,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;iBAC9C,QAAQ,CACP,wKAAwK,CACzK;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,6BAA6B;YACpC,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CACf,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC;IAEF,+BAA+B;IAC/B,SAAS,CAAC,YAAY,CACpB,gBAAgB,EAChB;QACE,WAAW,EACT,mPAAmP;QACrP,WAAW,EAAE;YACX,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,CACP,yEAAyE,CAC1E;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,wBAAwB;YAC/B,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CAAC,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAC7E,CAAC;IAEF,4EAA4E;IAC5E,MAAM,SAAS,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,0BAA0B,GAAG,SAAS;QAC1C,CAAC,CAAC,gOAAgO;QAClO,CAAC,CAAC,kJAAkJ,CAAC;IAEvJ,SAAS,CAAC,YAAY,CACpB,mBAAmB,EACnB;QACE,WAAW,EACT,0OAA0O;QAC5O,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,CAAC;iBACnE,QAAQ,CACP,2BAA2B,CACzB,OAAO,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAChD,CACF;YACH,gBAAgB,EAAE,CAAC;iBAChB,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;iBACtC,QAAQ,CAAC,0BAA0B,CAAC;YACvC,eAAe,EAAE,CAAC;iBACf,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,6HAA6H,CAC9H;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,yBAAyB;YAChC,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CACf,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC;IAEF,gCAAgC;IAChC,SAAS,CAAC,YAAY,CACpB,iBAAiB,EACjB;QACE,WAAW,EACT,+PAA+P;QACjQ,WAAW,EAAE;YACX,qBAAqB,EAAE,CAAC;iBACrB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,yEAAyE,CAC1E;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,+BAA+B;YACtC,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC;IAEF,kCAAkC;IAClC,SAAS,CAAC,YAAY,CACpB,mBAAmB,EACnB;QACE,WAAW,EACT,0PAA0P;QAC5P,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,CACP,4DAA4D,CAC7D;YACH,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yDAAyD,CAAC;SACvE;QACD,WAAW,EAAE;YACX,KAAK,EAAE,wBAAwB;YAC/B,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CACf,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC;IAEF,iCAAiC;IACjC,SAAS,CAAC,YAAY,CACpB,kBAAkB,EAClB;QACE,WAAW,EACT,oNAAoN;QACtN,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CACP,8FAA8F,CAC/F;YACH,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,8DAA8D,CAC/D;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,4BAA4B;YACnC,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CACf,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC;IAEF,+BAA+B;IAC/B,SAAS,CAAC,YAAY,CACpB,gBAAgB,EAChB;QACE,WAAW,EACT,gMAAgM;QAClM,WAAW,EAAE;YACX,gBAAgB,EAAE,CAAC;iBAChB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,sEAAsE,CACvE;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,wBAAwB;YAC/B,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CAAC,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAC7E,CAAC;IAEF,8BAA8B;IAC9B,SAAS,CAAC,YAAY,CACpB,eAAe,EACf;QACE,WAAW,EACT,qPAAqP;QACvP,WAAW,EAAE;QACX,6BAA6B;SAC9B;QACD,WAAW,EAAE;YACX,KAAK,EAAE,2BAA2B;YAClC,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CAAC,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAC5E,CAAC;IAEF,sEAAsE;IACtE,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,kBAAkB,GAAG,MAAM,eAAe,CAAC,qBAAqB,EAAE,CAAC;IAEzE,SAAS,CAAC,YAAY,CACpB,oBAAoB,EACpB;QACE,WAAW,EACT,+JAA+J;YAC/J,4CAA4C;YAC5C,gCAAgC;YAChC,4CAA4C;YAC5C,4CAA4C;YAC5C,4BAA4B;YAC5B,sFAAsF;YACtF,uDAAuD;YACvD,6BAA6B;YAC7B,wGAAwG;YACxG,yFAAyF;QAC3F,WAAW,EAAE;YACX,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,OAAO,CAAC,WAAW,CAAC;iBACpB,QAAQ,CACP,8CAA8C,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CACpI;YACH,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CACP,8CAA8C,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CACpI;YACH,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,OAAO,CAAC,WAAW,CAAC;iBACpB,QAAQ,CACP,wCAAwC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CACxH;SACJ;QACD,WAAW,EAAE;YACX,KAAK,EAAE,kCAAkC;YACzC,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CACf,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC;IAEF,wBAAwB;IACxB,SAAS,CAAC,YAAY,CACpB,SAAS,EACT;QACE,WAAW,EACT,gPAAgP;QAClP,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACpE;QACD,WAAW,EAAE;YACX,KAAK,EAAE,uBAAuB;YAC9B,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,iBAAiB,CAAC,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,CACtE,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;QAC/C,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE;KAC3B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAoB,EACpB,gBAAkC,EAClC,gBAAkC,EAClC,OAAsB;IAEtB,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE1C,4BAA4B;IAC5B,SAAS,CAAC,QAAQ,CAChB,kBAAkB,EAClB,gBAAgB,EAChB;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,qNAAqN;QACvN,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAQ,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,WAAW,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;gBAC1D,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B;gBACnC,IAAI,EAAE;oBACJ,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,mCAAmC;oBACzC,QAAQ,EAAE,YAAY;iBACvB;aACF,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,gBAAgB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,8BAA8B;IAC9B,SAAS,CAAC,QAAQ,CAChB,oBAAoB,EACpB,iBAAiB,EACjB;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EACT,8NAA8N;QAChO,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAQ,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,WAAW,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;gBAC1D,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B;gBACnC,IAAI,EAAE;oBACJ,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,KAAK,EAAE,4BAA4B;wBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,EACD,IAAI,EACJ,CAAC,CACF;oBACD,QAAQ,EAAE,kBAAkB;iBAC7B;aACF,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,gBAAgB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,yBAAyB;IACzB,SAAS,CAAC,QAAQ,CAChB,eAAe,EACf,kBAAkB,EAClB;QACE,IAAI,EAAE,mCAAmC;QACzC,WAAW,EACT,uLAAuL;QACzL,QAAQ,EAAE,YAAY;KACvB,EACD,KAAK,EAAE,GAAQ,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,WAAW,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;gBAC1D,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B;gBACnC,IAAI,EAAE;oBACJ,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,iDAAiD;oBACvD,QAAQ,EAAE,YAAY;iBACvB;aACF,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,gBAAgB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC,CACF,CAAC;IAEF,sCAAsC;IACtC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,mBAAmB,EAAE;QACjE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,4CAA4C;YAC5C,MAAM,kBAAkB,GACtB,OAAO,CAAC,eAAe,CAAC,+BAA+B,CACrD,OAAO,CAAC,WAAW,CACpB,CAAC;YACJ,OAAO;gBACL,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC7C,GAAG,EAAE,cAAc,QAAQ,CAAC,IAAI,EAAE;oBAClC,IAAI,EAAE,QAAQ,CAAC,WAAW;oBAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,QAAQ,EAAE,oBAAoB;iBAC/B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5B,wCAAwC;gBACxC,MAAM,kBAAkB,GACtB,OAAO,CAAC,eAAe,CAAC,+BAA+B,CACrD,OAAO,CAAC,WAAW,CACpB,CAAC;gBACJ,OAAO,kBAAkB;qBACtB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;SACF;KACF,CAAC,CAAC;IAEH,SAAS,CAAC,QAAQ,CAChB,WAAW,EACX,gBAAgB,EAChB;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,wGAAwG;QAC1G,QAAQ,EAAE,oBAAoB;KAC/B,EACD,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,kCAAkC,CAAC,CAAC;QACtE,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;oBAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;QACnD,SAAS,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;QACpE,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;KACzC,CAAC,CAAC;AACL,CAAC"}
|