@d365portal/d365fo-context-mcp 1.0.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.
- package/LICENSE +21 -0
- package/README.md +686 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +150 -0
- package/dist/config.js.map +1 -0
- package/dist/d365-handlers.d.ts +81 -0
- package/dist/d365-handlers.d.ts.map +1 -0
- package/dist/d365-handlers.js +319 -0
- package/dist/d365-handlers.js.map +1 -0
- package/dist/d365-tools.d.ts +47 -0
- package/dist/d365-tools.d.ts.map +1 -0
- package/dist/d365-tools.js +194 -0
- package/dist/d365-tools.js.map +1 -0
- package/dist/embedding.d.ts +5 -0
- package/dist/embedding.d.ts.map +1 -0
- package/dist/embedding.js +77 -0
- package/dist/embedding.js.map +1 -0
- package/dist/handlers.d.ts +74 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +686 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +270 -0
- package/dist/index.js.map +1 -0
- package/dist/snapshot.d.ts +95 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +439 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/sync.d.ts +11 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +123 -0
- package/dist/sync.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +27 -0
- package/dist/utils.js.map +1 -0
- package/package.json +42 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface ContextMcpConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
embeddingProvider: 'OpenAI' | 'VoyageAI' | 'Gemini' | 'Ollama';
|
|
5
|
+
embeddingModel: string;
|
|
6
|
+
openaiApiKey?: string;
|
|
7
|
+
openaiBaseUrl?: string;
|
|
8
|
+
voyageaiApiKey?: string;
|
|
9
|
+
geminiApiKey?: string;
|
|
10
|
+
geminiBaseUrl?: string;
|
|
11
|
+
ollamaModel?: string;
|
|
12
|
+
ollamaHost?: string;
|
|
13
|
+
milvusAddress?: string;
|
|
14
|
+
milvusToken?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CodebaseSnapshotV1 {
|
|
17
|
+
indexedCodebases: string[];
|
|
18
|
+
indexingCodebases: string[] | Record<string, number>;
|
|
19
|
+
lastUpdated: string;
|
|
20
|
+
}
|
|
21
|
+
interface CodebaseInfoBase {
|
|
22
|
+
lastUpdated: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CodebaseInfoIndexing extends CodebaseInfoBase {
|
|
25
|
+
status: 'indexing';
|
|
26
|
+
indexingPercentage: number;
|
|
27
|
+
}
|
|
28
|
+
export interface CodebaseInfoIndexed extends CodebaseInfoBase {
|
|
29
|
+
status: 'indexed';
|
|
30
|
+
indexedFiles: number;
|
|
31
|
+
totalChunks: number;
|
|
32
|
+
indexStatus: 'completed' | 'limit_reached';
|
|
33
|
+
}
|
|
34
|
+
export interface CodebaseInfoIndexFailed extends CodebaseInfoBase {
|
|
35
|
+
status: 'indexfailed';
|
|
36
|
+
errorMessage: string;
|
|
37
|
+
lastAttemptedPercentage?: number;
|
|
38
|
+
}
|
|
39
|
+
export type CodebaseInfo = CodebaseInfoIndexing | CodebaseInfoIndexed | CodebaseInfoIndexFailed;
|
|
40
|
+
export interface CodebaseSnapshotV2 {
|
|
41
|
+
formatVersion: 'v2';
|
|
42
|
+
codebases: Record<string, CodebaseInfo>;
|
|
43
|
+
lastUpdated: string;
|
|
44
|
+
}
|
|
45
|
+
export type CodebaseSnapshot = CodebaseSnapshotV1 | CodebaseSnapshotV2;
|
|
46
|
+
export declare function getDefaultModelForProvider(provider: string): string;
|
|
47
|
+
export declare function getEmbeddingModelForProvider(provider: string): string;
|
|
48
|
+
export declare function createMcpConfig(): ContextMcpConfig;
|
|
49
|
+
export declare function logConfigurationSummary(config: ContextMcpConfig): void;
|
|
50
|
+
export declare function showHelpMessage(): void;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAEhB,iBAAiB,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/D,cAAc,EAAE,MAAM,CAAC;IAEvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAGD,MAAM,WAAW,kBAAkB;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;CACvB;AAKD,UAAU,gBAAgB;IACtB,WAAW,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC1D,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAGD,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC;CAC9C;AAGD,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC7D,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACpC;AAGD,MAAM,MAAM,YAAY,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,uBAAuB,CAAC;AAEhG,MAAM,WAAW,kBAAkB;IAC/B,aAAa,EAAE,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAGvE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAanE;AAGD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBrE;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CAgClD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAiCtE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAmDtC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { envManager } from "@d365portal/d365fo-context-core";
|
|
2
|
+
// Helper function to get default model for each provider
|
|
3
|
+
export function getDefaultModelForProvider(provider) {
|
|
4
|
+
switch (provider) {
|
|
5
|
+
case 'OpenAI':
|
|
6
|
+
return 'text-embedding-3-small';
|
|
7
|
+
case 'VoyageAI':
|
|
8
|
+
return 'voyage-code-3';
|
|
9
|
+
case 'Gemini':
|
|
10
|
+
return 'gemini-embedding-001';
|
|
11
|
+
case 'Ollama':
|
|
12
|
+
return 'nomic-embed-text';
|
|
13
|
+
default:
|
|
14
|
+
return 'text-embedding-3-small';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Helper function to get embedding model with provider-specific environment variable priority
|
|
18
|
+
export function getEmbeddingModelForProvider(provider) {
|
|
19
|
+
switch (provider) {
|
|
20
|
+
case 'Ollama':
|
|
21
|
+
// For Ollama, prioritize OLLAMA_MODEL over EMBEDDING_MODEL for backward compatibility
|
|
22
|
+
const ollamaModel = envManager.get('OLLAMA_MODEL') || envManager.get('EMBEDDING_MODEL') || getDefaultModelForProvider(provider);
|
|
23
|
+
console.log(`[DEBUG] 🎯 Ollama model selection: OLLAMA_MODEL=${envManager.get('OLLAMA_MODEL') || 'NOT SET'}, EMBEDDING_MODEL=${envManager.get('EMBEDDING_MODEL') || 'NOT SET'}, selected=${ollamaModel}`);
|
|
24
|
+
return ollamaModel;
|
|
25
|
+
case 'OpenAI':
|
|
26
|
+
case 'VoyageAI':
|
|
27
|
+
case 'Gemini':
|
|
28
|
+
default:
|
|
29
|
+
// For all other providers, use EMBEDDING_MODEL or default
|
|
30
|
+
const selectedModel = envManager.get('EMBEDDING_MODEL') || getDefaultModelForProvider(provider);
|
|
31
|
+
console.log(`[DEBUG] 🎯 ${provider} model selection: EMBEDDING_MODEL=${envManager.get('EMBEDDING_MODEL') || 'NOT SET'}, selected=${selectedModel}`);
|
|
32
|
+
return selectedModel;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function createMcpConfig() {
|
|
36
|
+
// Debug: Print all environment variables related to Context
|
|
37
|
+
console.log(`[DEBUG] 🔍 Environment Variables Debug:`);
|
|
38
|
+
console.log(`[DEBUG] EMBEDDING_PROVIDER: ${envManager.get('EMBEDDING_PROVIDER') || 'NOT SET'}`);
|
|
39
|
+
console.log(`[DEBUG] EMBEDDING_MODEL: ${envManager.get('EMBEDDING_MODEL') || 'NOT SET'}`);
|
|
40
|
+
console.log(`[DEBUG] OLLAMA_MODEL: ${envManager.get('OLLAMA_MODEL') || 'NOT SET'}`);
|
|
41
|
+
console.log(`[DEBUG] GEMINI_API_KEY: ${envManager.get('GEMINI_API_KEY') ? 'SET (length: ' + envManager.get('GEMINI_API_KEY').length + ')' : 'NOT SET'}`);
|
|
42
|
+
console.log(`[DEBUG] OPENAI_API_KEY: ${envManager.get('OPENAI_API_KEY') ? 'SET (length: ' + envManager.get('OPENAI_API_KEY').length + ')' : 'NOT SET'}`);
|
|
43
|
+
console.log(`[DEBUG] MILVUS_ADDRESS: ${envManager.get('MILVUS_ADDRESS') || 'NOT SET'}`);
|
|
44
|
+
console.log(`[DEBUG] NODE_ENV: ${envManager.get('NODE_ENV') || 'NOT SET'}`);
|
|
45
|
+
const config = {
|
|
46
|
+
name: envManager.get('MCP_SERVER_NAME') || "Context MCP Server",
|
|
47
|
+
version: envManager.get('MCP_SERVER_VERSION') || "1.0.0",
|
|
48
|
+
// Embedding provider configuration
|
|
49
|
+
embeddingProvider: envManager.get('EMBEDDING_PROVIDER') || 'OpenAI',
|
|
50
|
+
embeddingModel: getEmbeddingModelForProvider(envManager.get('EMBEDDING_PROVIDER') || 'OpenAI'),
|
|
51
|
+
// Provider-specific API keys
|
|
52
|
+
openaiApiKey: envManager.get('OPENAI_API_KEY'),
|
|
53
|
+
openaiBaseUrl: envManager.get('OPENAI_BASE_URL'),
|
|
54
|
+
voyageaiApiKey: envManager.get('VOYAGEAI_API_KEY'),
|
|
55
|
+
geminiApiKey: envManager.get('GEMINI_API_KEY'),
|
|
56
|
+
geminiBaseUrl: envManager.get('GEMINI_BASE_URL'),
|
|
57
|
+
// Ollama configuration
|
|
58
|
+
ollamaModel: envManager.get('OLLAMA_MODEL'),
|
|
59
|
+
ollamaHost: envManager.get('OLLAMA_HOST'),
|
|
60
|
+
// Vector database configuration - address can be auto-resolved from token
|
|
61
|
+
milvusAddress: envManager.get('MILVUS_ADDRESS'), // Optional, can be resolved from token
|
|
62
|
+
milvusToken: envManager.get('MILVUS_TOKEN')
|
|
63
|
+
};
|
|
64
|
+
return config;
|
|
65
|
+
}
|
|
66
|
+
export function logConfigurationSummary(config) {
|
|
67
|
+
// Log configuration summary before starting server
|
|
68
|
+
console.log(`[MCP] 🚀 Starting Context MCP Server`);
|
|
69
|
+
console.log(`[MCP] Configuration Summary:`);
|
|
70
|
+
console.log(`[MCP] Server: ${config.name} v${config.version}`);
|
|
71
|
+
console.log(`[MCP] Embedding Provider: ${config.embeddingProvider}`);
|
|
72
|
+
console.log(`[MCP] Embedding Model: ${config.embeddingModel}`);
|
|
73
|
+
console.log(`[MCP] Milvus Address: ${config.milvusAddress || (config.milvusToken ? '[Auto-resolve from token]' : '[Not configured]')}`);
|
|
74
|
+
// Log provider-specific configuration without exposing sensitive data
|
|
75
|
+
switch (config.embeddingProvider) {
|
|
76
|
+
case 'OpenAI':
|
|
77
|
+
console.log(`[MCP] OpenAI API Key: ${config.openaiApiKey ? '✅ Configured' : '❌ Missing'}`);
|
|
78
|
+
if (config.openaiBaseUrl) {
|
|
79
|
+
console.log(`[MCP] OpenAI Base URL: ${config.openaiBaseUrl}`);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case 'VoyageAI':
|
|
83
|
+
console.log(`[MCP] VoyageAI API Key: ${config.voyageaiApiKey ? '✅ Configured' : '❌ Missing'}`);
|
|
84
|
+
break;
|
|
85
|
+
case 'Gemini':
|
|
86
|
+
console.log(`[MCP] Gemini API Key: ${config.geminiApiKey ? '✅ Configured' : '❌ Missing'}`);
|
|
87
|
+
if (config.geminiBaseUrl) {
|
|
88
|
+
console.log(`[MCP] Gemini Base URL: ${config.geminiBaseUrl}`);
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case 'Ollama':
|
|
92
|
+
console.log(`[MCP] Ollama Host: ${config.ollamaHost || 'http://127.0.0.1:11434'}`);
|
|
93
|
+
console.log(`[MCP] Ollama Model: ${config.embeddingModel}`);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
console.log(`[MCP] 🔧 Initializing server components...`);
|
|
97
|
+
}
|
|
98
|
+
export function showHelpMessage() {
|
|
99
|
+
console.log(`
|
|
100
|
+
Context MCP Server
|
|
101
|
+
|
|
102
|
+
Usage: npx @zilliz/claude-context-mcp@latest [options]
|
|
103
|
+
|
|
104
|
+
Options:
|
|
105
|
+
--help, -h Show this help message
|
|
106
|
+
|
|
107
|
+
Environment Variables:
|
|
108
|
+
MCP_SERVER_NAME Server name
|
|
109
|
+
MCP_SERVER_VERSION Server version
|
|
110
|
+
|
|
111
|
+
Embedding Provider Configuration:
|
|
112
|
+
EMBEDDING_PROVIDER Embedding provider: OpenAI, VoyageAI, Gemini, Ollama (default: OpenAI)
|
|
113
|
+
EMBEDDING_MODEL Embedding model name (works for all providers)
|
|
114
|
+
|
|
115
|
+
Provider-specific API Keys:
|
|
116
|
+
OPENAI_API_KEY OpenAI API key (required for OpenAI provider)
|
|
117
|
+
OPENAI_BASE_URL OpenAI API base URL (optional, for custom endpoints)
|
|
118
|
+
VOYAGEAI_API_KEY VoyageAI API key (required for VoyageAI provider)
|
|
119
|
+
GEMINI_API_KEY Google AI API key (required for Gemini provider)
|
|
120
|
+
GEMINI_BASE_URL Gemini API base URL (optional, for custom endpoints)
|
|
121
|
+
|
|
122
|
+
Ollama Configuration:
|
|
123
|
+
OLLAMA_HOST Ollama server host (default: http://127.0.0.1:11434)
|
|
124
|
+
OLLAMA_MODEL Ollama model name (alternative to EMBEDDING_MODEL for Ollama)
|
|
125
|
+
|
|
126
|
+
Vector Database Configuration:
|
|
127
|
+
MILVUS_ADDRESS Milvus address (optional, can be auto-resolved from token)
|
|
128
|
+
MILVUS_TOKEN Milvus token (optional, used for authentication and address resolution)
|
|
129
|
+
|
|
130
|
+
Examples:
|
|
131
|
+
# Start MCP server with OpenAI (default) and explicit Milvus address
|
|
132
|
+
OPENAI_API_KEY=sk-xxx MILVUS_ADDRESS=localhost:19530 npx @zilliz/claude-context-mcp@latest
|
|
133
|
+
|
|
134
|
+
# Start MCP server with OpenAI and specific model
|
|
135
|
+
OPENAI_API_KEY=sk-xxx EMBEDDING_MODEL=text-embedding-3-large MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
|
|
136
|
+
|
|
137
|
+
# Start MCP server with VoyageAI and specific model
|
|
138
|
+
EMBEDDING_PROVIDER=VoyageAI VOYAGEAI_API_KEY=pa-xxx EMBEDDING_MODEL=voyage-3-large MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
|
|
139
|
+
|
|
140
|
+
# Start MCP server with Gemini and specific model
|
|
141
|
+
EMBEDDING_PROVIDER=Gemini GEMINI_API_KEY=xxx EMBEDDING_MODEL=gemini-embedding-001 MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
|
|
142
|
+
|
|
143
|
+
# Start MCP server with Ollama and specific model (using OLLAMA_MODEL)
|
|
144
|
+
EMBEDDING_PROVIDER=Ollama OLLAMA_MODEL=mxbai-embed-large MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
|
|
145
|
+
|
|
146
|
+
# Start MCP server with Ollama and specific model (using EMBEDDING_MODEL)
|
|
147
|
+
EMBEDDING_PROVIDER=Ollama EMBEDDING_MODEL=nomic-embed-text MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
|
|
148
|
+
`);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D365 Finance & Operations Tool Handlers
|
|
3
|
+
*
|
|
4
|
+
* This module provides handlers for all D365FO-specific MCP tools.
|
|
5
|
+
* Handlers use semantic search with folder-based filtering to find relevant examples.
|
|
6
|
+
*/
|
|
7
|
+
import { Context } from "@d365portal/d365fo-context-core";
|
|
8
|
+
import { SnapshotManager } from "./snapshot.js";
|
|
9
|
+
interface D365ContextArgs {
|
|
10
|
+
query: string;
|
|
11
|
+
topK?: number;
|
|
12
|
+
includePatterns?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface D365RelationshipArgs {
|
|
15
|
+
objectName: string;
|
|
16
|
+
objectType: string;
|
|
17
|
+
depth?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* D365 Tool Handlers Class
|
|
21
|
+
*
|
|
22
|
+
* Provides specialized handlers for D365FO object type context tools
|
|
23
|
+
* and relationship analysis.
|
|
24
|
+
*/
|
|
25
|
+
export declare class D365ToolHandlers {
|
|
26
|
+
private context;
|
|
27
|
+
private snapshotManager;
|
|
28
|
+
private d365CodebasePath;
|
|
29
|
+
constructor(context: Context, snapshotManager: SnapshotManager);
|
|
30
|
+
/**
|
|
31
|
+
* Set the D365FO codebase path for all D365 tool operations
|
|
32
|
+
*/
|
|
33
|
+
setD365CodebasePath(path: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Auto-detect D365FO codebase from indexed codebases
|
|
36
|
+
* Looks for codebases containing AxClass, AxTable folders
|
|
37
|
+
*/
|
|
38
|
+
private detectD365Codebase;
|
|
39
|
+
/**
|
|
40
|
+
* Get the active D365FO codebase path
|
|
41
|
+
*/
|
|
42
|
+
private getActiveCodebasePath;
|
|
43
|
+
/**
|
|
44
|
+
* Handle context tool calls for any D365 object type
|
|
45
|
+
*/
|
|
46
|
+
handleObjectContext(toolName: string, args: D365ContextArgs): Promise<{
|
|
47
|
+
content: Array<{
|
|
48
|
+
type: string;
|
|
49
|
+
text: string;
|
|
50
|
+
}>;
|
|
51
|
+
isError?: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Core context search handler
|
|
55
|
+
*/
|
|
56
|
+
private handleContextSearch;
|
|
57
|
+
/**
|
|
58
|
+
* Handle relationship analysis tool
|
|
59
|
+
*/
|
|
60
|
+
handleRelationshipAnalysis(args: D365RelationshipArgs): Promise<{
|
|
61
|
+
content: Array<{
|
|
62
|
+
type: string;
|
|
63
|
+
text: string;
|
|
64
|
+
}>;
|
|
65
|
+
isError?: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* Format context search response
|
|
69
|
+
*/
|
|
70
|
+
private formatContextResponse;
|
|
71
|
+
/**
|
|
72
|
+
* Extract common patterns from search results
|
|
73
|
+
*/
|
|
74
|
+
private extractPatterns;
|
|
75
|
+
/**
|
|
76
|
+
* Format relationship analysis response
|
|
77
|
+
*/
|
|
78
|
+
private formatRelationshipResponse;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=d365-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d365-handlers.d.ts","sourceRoot":"","sources":["../src/d365-handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,UAAU,eAAe;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,oBAAoB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD;;;;;GAKG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe;IAK9D;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9C;;;OAGG;YACW,kBAAkB;IAuBhC;;OAEG;YACW,qBAAqB;IASnC;;OAEG;IACU,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAgBzJ;;OAEG;YACW,mBAAmB;IAwDjC;;OAEG;IACU,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAiDnJ;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwD7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA2DvB;;OAEG;IACH,OAAO,CAAC,0BAA0B;CAwErC"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D365 Finance & Operations Tool Handlers
|
|
3
|
+
*
|
|
4
|
+
* This module provides handlers for all D365FO-specific MCP tools.
|
|
5
|
+
* Handlers use semantic search with folder-based filtering to find relevant examples.
|
|
6
|
+
*/
|
|
7
|
+
import { findObjectTypeByToolName } from "./d365-tools.js";
|
|
8
|
+
import * as fs from "fs";
|
|
9
|
+
/**
|
|
10
|
+
* D365 Tool Handlers Class
|
|
11
|
+
*
|
|
12
|
+
* Provides specialized handlers for D365FO object type context tools
|
|
13
|
+
* and relationship analysis.
|
|
14
|
+
*/
|
|
15
|
+
export class D365ToolHandlers {
|
|
16
|
+
constructor(context, snapshotManager) {
|
|
17
|
+
this.d365CodebasePath = null;
|
|
18
|
+
this.context = context;
|
|
19
|
+
this.snapshotManager = snapshotManager;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set the D365FO codebase path for all D365 tool operations
|
|
23
|
+
*/
|
|
24
|
+
setD365CodebasePath(path) {
|
|
25
|
+
this.d365CodebasePath = path;
|
|
26
|
+
console.log(`[D365-HANDLERS] Set D365FO codebase path: ${path}`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Auto-detect D365FO codebase from indexed codebases
|
|
30
|
+
* Looks for codebases containing AxClass, AxTable folders
|
|
31
|
+
*/
|
|
32
|
+
async detectD365Codebase() {
|
|
33
|
+
const indexedCodebases = this.snapshotManager.getIndexedCodebases();
|
|
34
|
+
for (const codebasePath of indexedCodebases) {
|
|
35
|
+
try {
|
|
36
|
+
// Check if this codebase contains D365FO structure
|
|
37
|
+
const axClassPath = `${codebasePath}/AxClass`;
|
|
38
|
+
const axTablePath = `${codebasePath}/AxTable`;
|
|
39
|
+
if (fs.existsSync(axClassPath) || fs.existsSync(axTablePath)) {
|
|
40
|
+
console.log(`[D365-HANDLERS] Auto-detected D365FO codebase: ${codebasePath}`);
|
|
41
|
+
this.d365CodebasePath = codebasePath;
|
|
42
|
+
return codebasePath;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
// Continue to next codebase
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
console.log(`[D365-HANDLERS] No D365FO codebase detected in indexed codebases`);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the active D365FO codebase path
|
|
54
|
+
*/
|
|
55
|
+
async getActiveCodebasePath() {
|
|
56
|
+
if (this.d365CodebasePath) {
|
|
57
|
+
return this.d365CodebasePath;
|
|
58
|
+
}
|
|
59
|
+
// Try to auto-detect
|
|
60
|
+
return await this.detectD365Codebase();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Handle context tool calls for any D365 object type
|
|
64
|
+
*/
|
|
65
|
+
async handleObjectContext(toolName, args) {
|
|
66
|
+
const typeConfig = findObjectTypeByToolName(toolName);
|
|
67
|
+
if (!typeConfig) {
|
|
68
|
+
return {
|
|
69
|
+
content: [{
|
|
70
|
+
type: "text",
|
|
71
|
+
text: `Error: Unknown D365 tool '${toolName}'. This tool is not registered.`
|
|
72
|
+
}],
|
|
73
|
+
isError: true
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return await this.handleContextSearch(typeConfig, args);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Core context search handler
|
|
80
|
+
*/
|
|
81
|
+
async handleContextSearch(typeConfig, args) {
|
|
82
|
+
const { query, topK = 5, includePatterns = true } = args;
|
|
83
|
+
try {
|
|
84
|
+
// Get active codebase path
|
|
85
|
+
const codebasePath = await this.getActiveCodebasePath();
|
|
86
|
+
if (!codebasePath) {
|
|
87
|
+
return {
|
|
88
|
+
content: [{
|
|
89
|
+
type: "text",
|
|
90
|
+
text: `Error: No D365FO codebase is indexed. Please index a Dynamics 365 Finance & Operations codebase first using the index_codebase tool.\n\n` +
|
|
91
|
+
`The D365FO codebase should contain folders like AxClass, AxTable, AxForm, etc.`
|
|
92
|
+
}],
|
|
93
|
+
isError: true
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Build filter expression to search only in the specific object type folder
|
|
97
|
+
// Note: Windows paths use backslash, so we need to escape it for the LIKE pattern
|
|
98
|
+
// The pattern matches both forward slash and backslash variants
|
|
99
|
+
const filterExpr = `relativePath like "${typeConfig.folder}\\\\%" or relativePath like "${typeConfig.folder}/%"`;
|
|
100
|
+
console.log(`[D365-HANDLERS] Searching ${typeConfig.folder} with query: "${query}"`);
|
|
101
|
+
console.log(`[D365-HANDLERS] Filter expression: ${filterExpr}`);
|
|
102
|
+
console.log(`[D365-HANDLERS] Codebase: ${codebasePath}`);
|
|
103
|
+
// Perform semantic search with folder filter
|
|
104
|
+
const results = await this.context.semanticSearch(codebasePath, query, Math.min(topK, 20), // Cap at 20
|
|
105
|
+
0.3, // Threshold
|
|
106
|
+
filterExpr);
|
|
107
|
+
console.log(`[D365-HANDLERS] Found ${results.length} results for ${typeConfig.folder}`);
|
|
108
|
+
// Format response
|
|
109
|
+
return this.formatContextResponse(results, typeConfig, query, includePatterns);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(`[D365-HANDLERS] Error in handleContextSearch:`, error);
|
|
113
|
+
return {
|
|
114
|
+
content: [{
|
|
115
|
+
type: "text",
|
|
116
|
+
text: `Error searching ${typeConfig.desc}: ${error.message || error}`
|
|
117
|
+
}],
|
|
118
|
+
isError: true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handle relationship analysis tool
|
|
124
|
+
*/
|
|
125
|
+
async handleRelationshipAnalysis(args) {
|
|
126
|
+
const { objectName, objectType, depth = 2 } = args;
|
|
127
|
+
try {
|
|
128
|
+
const codebasePath = await this.getActiveCodebasePath();
|
|
129
|
+
if (!codebasePath) {
|
|
130
|
+
return {
|
|
131
|
+
content: [{
|
|
132
|
+
type: "text",
|
|
133
|
+
text: `Error: No D365FO codebase is indexed. Please index a Dynamics 365 Finance & Operations codebase first.`
|
|
134
|
+
}],
|
|
135
|
+
isError: true
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
console.log(`[D365-HANDLERS] Analyzing relationships for ${objectName} (${objectType})`);
|
|
139
|
+
// Search for references to this object across all object types
|
|
140
|
+
const query = `${objectName} reference usage implementation`;
|
|
141
|
+
const results = await this.context.semanticSearch(codebasePath, query, 50, // Get more results for relationship analysis
|
|
142
|
+
0.25 // Lower threshold to catch more references
|
|
143
|
+
);
|
|
144
|
+
// Filter results to only those that actually reference the object
|
|
145
|
+
const relevantResults = results.filter(r => r.content.includes(objectName));
|
|
146
|
+
console.log(`[D365-HANDLERS] Found ${relevantResults.length} relevant references out of ${results.length} total`);
|
|
147
|
+
// Format relationship response
|
|
148
|
+
return this.formatRelationshipResponse(objectName, objectType, relevantResults, depth);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(`[D365-HANDLERS] Error in handleRelationshipAnalysis:`, error);
|
|
152
|
+
return {
|
|
153
|
+
content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: `Error analyzing relationships for ${objectName}: ${error.message || error}`
|
|
156
|
+
}],
|
|
157
|
+
isError: true
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Format context search response
|
|
163
|
+
*/
|
|
164
|
+
formatContextResponse(results, typeConfig, query, includePatterns) {
|
|
165
|
+
const capitalizedDesc = typeConfig.desc.charAt(0).toUpperCase() + typeConfig.desc.slice(1);
|
|
166
|
+
if (results.length === 0) {
|
|
167
|
+
return {
|
|
168
|
+
content: [{
|
|
169
|
+
type: "text",
|
|
170
|
+
text: `## No ${capitalizedDesc} Found\n\n` +
|
|
171
|
+
`No matching ${typeConfig.desc} found for query: "${query}"\n\n` +
|
|
172
|
+
`**Suggestions:**\n` +
|
|
173
|
+
`- Try a more general search term\n` +
|
|
174
|
+
`- Check if the ${typeConfig.folder} folder contains relevant files\n` +
|
|
175
|
+
`- Verify the codebase is fully indexed`
|
|
176
|
+
}]
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
let response = `## ${capitalizedDesc} Examples\n\n`;
|
|
180
|
+
response += `Found ${results.length} matching ${typeConfig.desc} for: "${query}"\n\n`;
|
|
181
|
+
// Add examples
|
|
182
|
+
results.forEach((result, index) => {
|
|
183
|
+
const fileName = result.relativePath.split('/').pop() || 'Unknown';
|
|
184
|
+
const score = result.score ? `(${(result.score * 100).toFixed(1)}% match)` : '';
|
|
185
|
+
response += `### ${index + 1}. ${fileName} ${score}\n`;
|
|
186
|
+
response += `**Path:** \`${result.relativePath}\`\n\n`;
|
|
187
|
+
// Truncate content if too long
|
|
188
|
+
const maxContentLength = 2000;
|
|
189
|
+
let content = result.content;
|
|
190
|
+
if (content.length > maxContentLength) {
|
|
191
|
+
content = content.substring(0, maxContentLength) + '\n... (truncated)';
|
|
192
|
+
}
|
|
193
|
+
response += '```xml\n' + content + '\n```\n\n';
|
|
194
|
+
});
|
|
195
|
+
// Add patterns section
|
|
196
|
+
if (includePatterns && results.length > 0) {
|
|
197
|
+
response += this.extractPatterns(results, typeConfig);
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
content: [{
|
|
201
|
+
type: "text",
|
|
202
|
+
text: response
|
|
203
|
+
}]
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Extract common patterns from search results
|
|
208
|
+
*/
|
|
209
|
+
extractPatterns(results, typeConfig) {
|
|
210
|
+
let patterns = `## Common Patterns for ${typeConfig.folder}\n\n`;
|
|
211
|
+
// Analyze results to extract patterns
|
|
212
|
+
const methodNames = new Set();
|
|
213
|
+
const inheritancePatterns = new Set();
|
|
214
|
+
const commonElements = new Set();
|
|
215
|
+
results.forEach(result => {
|
|
216
|
+
const content = result.content;
|
|
217
|
+
// Extract method names (X++ pattern)
|
|
218
|
+
const methodMatches = content.match(/public\s+\w+\s+(\w+)\s*\(/g);
|
|
219
|
+
if (methodMatches) {
|
|
220
|
+
methodMatches.forEach(m => {
|
|
221
|
+
const name = m.match(/(\w+)\s*\(/)?.[1];
|
|
222
|
+
if (name)
|
|
223
|
+
methodNames.add(name);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Extract extends clauses
|
|
227
|
+
const extendsMatch = content.match(/extends\s+(\w+)/);
|
|
228
|
+
if (extendsMatch) {
|
|
229
|
+
inheritancePatterns.add(extendsMatch[1]);
|
|
230
|
+
}
|
|
231
|
+
// Extract common XML elements
|
|
232
|
+
const elementMatches = content.match(/<(\w+)[\s>]/g);
|
|
233
|
+
if (elementMatches) {
|
|
234
|
+
elementMatches.slice(0, 20).forEach(m => {
|
|
235
|
+
const elem = m.match(/<(\w+)/)?.[1];
|
|
236
|
+
if (elem && elem.length > 2)
|
|
237
|
+
commonElements.add(elem);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// Build patterns section
|
|
242
|
+
if (methodNames.size > 0) {
|
|
243
|
+
patterns += `**Common Methods:**\n`;
|
|
244
|
+
patterns += Array.from(methodNames).slice(0, 10).map(m => `- \`${m}()\``).join('\n') + '\n\n';
|
|
245
|
+
}
|
|
246
|
+
if (inheritancePatterns.size > 0) {
|
|
247
|
+
patterns += `**Inheritance Patterns:**\n`;
|
|
248
|
+
patterns += Array.from(inheritancePatterns).slice(0, 5).map(p => `- extends \`${p}\``).join('\n') + '\n\n';
|
|
249
|
+
}
|
|
250
|
+
if (commonElements.size > 0) {
|
|
251
|
+
patterns += `**Common XML Elements:**\n`;
|
|
252
|
+
patterns += Array.from(commonElements).slice(0, 10).map(e => `- \`<${e}>\``).join('\n') + '\n\n';
|
|
253
|
+
}
|
|
254
|
+
if (methodNames.size === 0 && inheritancePatterns.size === 0 && commonElements.size === 0) {
|
|
255
|
+
patterns += `*Pattern analysis not available for these results.*\n\n`;
|
|
256
|
+
}
|
|
257
|
+
return patterns;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Format relationship analysis response
|
|
261
|
+
*/
|
|
262
|
+
formatRelationshipResponse(objectName, objectType, results, depth) {
|
|
263
|
+
let response = `## Relationship Analysis: ${objectName} (${objectType})\n\n`;
|
|
264
|
+
if (results.length === 0) {
|
|
265
|
+
response += `No references found for ${objectName}.\n\n`;
|
|
266
|
+
response += `**Suggestions:**\n`;
|
|
267
|
+
response += `- Check if the object name is spelled correctly\n`;
|
|
268
|
+
response += `- The object may not be referenced by other objects\n`;
|
|
269
|
+
response += `- Try searching with the object type tool directly\n`;
|
|
270
|
+
return {
|
|
271
|
+
content: [{
|
|
272
|
+
type: "text",
|
|
273
|
+
text: response
|
|
274
|
+
}]
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
// Group results by object type folder
|
|
278
|
+
const groupedByType = {};
|
|
279
|
+
results.forEach(result => {
|
|
280
|
+
const folder = result.relativePath.split('/')[0] || 'Unknown';
|
|
281
|
+
if (!groupedByType[folder]) {
|
|
282
|
+
groupedByType[folder] = [];
|
|
283
|
+
}
|
|
284
|
+
groupedByType[folder].push(result);
|
|
285
|
+
});
|
|
286
|
+
response += `Found ${results.length} references across ${Object.keys(groupedByType).length} object types.\n\n`;
|
|
287
|
+
// Output grouped results
|
|
288
|
+
Object.entries(groupedByType)
|
|
289
|
+
.sort((a, b) => b[1].length - a[1].length) // Sort by count descending
|
|
290
|
+
.forEach(([folder, items]) => {
|
|
291
|
+
response += `### ${folder} (${items.length} references)\n\n`;
|
|
292
|
+
items.slice(0, 5).forEach(item => {
|
|
293
|
+
const fileName = item.relativePath.split('/').pop() || 'Unknown';
|
|
294
|
+
response += `- **${fileName}**\n`;
|
|
295
|
+
response += ` Path: \`${item.relativePath}\`\n`;
|
|
296
|
+
});
|
|
297
|
+
if (items.length > 5) {
|
|
298
|
+
response += ` *(${items.length - 5} more references...)*\n`;
|
|
299
|
+
}
|
|
300
|
+
response += '\n';
|
|
301
|
+
});
|
|
302
|
+
// Add summary
|
|
303
|
+
response += `## Summary\n\n`;
|
|
304
|
+
response += `| Object Type | Reference Count |\n`;
|
|
305
|
+
response += `|-------------|----------------|\n`;
|
|
306
|
+
Object.entries(groupedByType)
|
|
307
|
+
.sort((a, b) => b[1].length - a[1].length)
|
|
308
|
+
.forEach(([folder, items]) => {
|
|
309
|
+
response += `| ${folder} | ${items.length} |\n`;
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
content: [{
|
|
313
|
+
type: "text",
|
|
314
|
+
text: response
|
|
315
|
+
}]
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=d365-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d365-handlers.js","sourceRoot":"","sources":["../src/d365-handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAqC,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG9F,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AA0BzB;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAKzB,YAAY,OAAgB,EAAE,eAAgC;QAFtD,qBAAgB,GAAkB,IAAI,CAAC;QAG3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,IAAY;QACnC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB;QAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC;QAEpE,KAAK,MAAM,YAAY,IAAI,gBAAgB,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACD,mDAAmD;gBACnD,MAAM,WAAW,GAAG,GAAG,YAAY,UAAU,CAAC;gBAC9C,MAAM,WAAW,GAAG,GAAG,YAAY,UAAU,CAAC;gBAE9C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC3D,OAAO,CAAC,GAAG,CAAC,kDAAkD,YAAY,EAAE,CAAC,CAAC;oBAC9E,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;oBACrC,OAAO,YAAY,CAAC;gBACxB,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,4BAA4B;YAChC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB;QAC/B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;QACjC,CAAC;QAED,qBAAqB;QACrB,OAAO,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAAC,QAAgB,EAAE,IAAqB;QACpE,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,6BAA6B,QAAQ,iCAAiC;qBAC/E,CAAC;gBACF,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC7B,UAA0B,EAC1B,IAAqB;QAErB,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QAEzD,IAAI,CAAC;YACD,2BAA2B;YAC3B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAExD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,OAAO;oBACH,OAAO,EAAE,CAAC;4BACN,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,0IAA0I;gCAC5I,gFAAgF;yBACvF,CAAC;oBACF,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,4EAA4E;YAC5E,kFAAkF;YAClF,gEAAgE;YAChE,MAAM,UAAU,GAAG,sBAAsB,UAAU,CAAC,MAAM,gCAAgC,UAAU,CAAC,MAAM,KAAK,CAAC;YAEjH,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,CAAC,MAAM,iBAAiB,KAAK,GAAG,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;YAEzD,6CAA6C;YAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC7C,YAAY,EACZ,KAAK,EACL,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,YAAY;YAChC,GAAG,EAAE,YAAY;YACjB,UAAU,CACK,CAAC;YAEpB,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,MAAM,gBAAgB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAExF,kBAAkB;YAClB,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAEnF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,mBAAmB,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE;qBACxE,CAAC;gBACF,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,0BAA0B,CAAC,IAA0B;QAC9D,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;QAEnD,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAExD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,OAAO;oBACH,OAAO,EAAE,CAAC;4BACN,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,wGAAwG;yBACjH,CAAC;oBACF,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,UAAU,KAAK,UAAU,GAAG,CAAC,CAAC;YAEzF,+DAA+D;YAC/D,MAAM,KAAK,GAAG,GAAG,UAAU,iCAAiC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC7C,YAAY,EACZ,KAAK,EACL,EAAE,EAAE,6CAA6C;YACjD,IAAI,CAAC,2CAA2C;aACjC,CAAC;YAEpB,kEAAkE;YAClE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CACjC,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,eAAe,CAAC,MAAM,+BAA+B,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;YAElH,+BAA+B;YAC/B,OAAO,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QAE3F,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;YAC7E,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qCAAqC,UAAU,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE;qBACrF,CAAC;gBACF,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CACzB,OAAuB,EACvB,UAA0B,EAC1B,KAAa,EACb,eAAwB;QAExB,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,eAAe,YAAY;4BACtC,eAAe,UAAU,CAAC,IAAI,sBAAsB,KAAK,OAAO;4BAChE,oBAAoB;4BACpB,oCAAoC;4BACpC,kBAAkB,UAAU,CAAC,MAAM,mCAAmC;4BACtE,wCAAwC;qBAC/C,CAAC;aACL,CAAC;QACN,CAAC;QAED,IAAI,QAAQ,GAAG,MAAM,eAAe,eAAe,CAAC;QACpD,QAAQ,IAAI,SAAS,OAAO,CAAC,MAAM,aAAa,UAAU,CAAC,IAAI,UAAU,KAAK,OAAO,CAAC;QAEtF,eAAe;QACf,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;YACnE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAEhF,QAAQ,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC;YACvD,QAAQ,IAAI,eAAe,MAAM,CAAC,YAAY,QAAQ,CAAC;YAEvD,+BAA+B;YAC/B,MAAM,gBAAgB,GAAG,IAAI,CAAC;YAC9B,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBACpC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,mBAAmB,CAAC;YAC3E,CAAC;YAED,QAAQ,IAAI,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACjB,CAAC;SACL,CAAC;IACN,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAuB,EAAE,UAA0B;QACvE,IAAI,QAAQ,GAAG,0BAA0B,UAAU,CAAC,MAAM,MAAM,CAAC;QAEjE,sCAAsC;QACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QAEzC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAE/B,qCAAqC;YACrC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAClE,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACtB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxC,IAAI,IAAI;wBAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACP,CAAC;YAED,0BAA0B;YAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACtD,IAAI,YAAY,EAAE,CAAC;gBACf,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,8BAA8B;YAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrD,IAAI,cAAc,EAAE,CAAC;gBACjB,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACpC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;wBAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,IAAI,uBAAuB,CAAC;YACpC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAClG,CAAC;QAED,IAAI,mBAAmB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC/B,QAAQ,IAAI,6BAA6B,CAAC;YAC1C,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAC/G,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,IAAI,4BAA4B,CAAC;YACzC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACrG,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxF,QAAQ,IAAI,yDAAyD,CAAC;QAC1E,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,0BAA0B,CAC9B,UAAkB,EAClB,UAAkB,EAClB,OAAuB,EACvB,KAAa;QAEb,IAAI,QAAQ,GAAG,6BAA6B,UAAU,KAAK,UAAU,OAAO,CAAC;QAE7E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,QAAQ,IAAI,2BAA2B,UAAU,OAAO,CAAC;YACzD,QAAQ,IAAI,oBAAoB,CAAC;YACjC,QAAQ,IAAI,mDAAmD,CAAC;YAChE,QAAQ,IAAI,uDAAuD,CAAC;YACpE,QAAQ,IAAI,sDAAsD,CAAC;YAEnE,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ;qBACjB,CAAC;aACL,CAAC;QACN,CAAC;QAED,sCAAsC;QACtC,MAAM,aAAa,GAAmC,EAAE,CAAC;QAEzD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACrB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAC9D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC/B,CAAC;YACD,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,QAAQ,IAAI,SAAS,OAAO,CAAC,MAAM,sBAAsB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,oBAAoB,CAAC;QAE/G,yBAAyB;QACzB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;aACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,2BAA2B;aACrE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACzB,QAAQ,IAAI,OAAO,MAAM,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAC;YAE7D,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;gBACjE,QAAQ,IAAI,OAAO,QAAQ,MAAM,CAAC;gBAClC,QAAQ,IAAI,aAAa,IAAI,CAAC,YAAY,MAAM,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,yBAAyB,CAAC;YACjE,CAAC;YAED,QAAQ,IAAI,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;QAEP,cAAc;QACd,QAAQ,IAAI,gBAAgB,CAAC;QAC7B,QAAQ,IAAI,qCAAqC,CAAC;QAClD,QAAQ,IAAI,oCAAoC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;aACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;aACzC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACzB,QAAQ,IAAI,KAAK,MAAM,MAAM,KAAK,CAAC,MAAM,MAAM,CAAC;QACpD,CAAC,CAAC,CAAC;QAEP,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACjB,CAAC;SACL,CAAC;IACN,CAAC;CACJ"}
|