acuity-mcp-server 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/README.md +541 -0
- package/dist/auth/device-flow.d.ts +46 -0
- package/dist/auth/device-flow.d.ts.map +1 -0
- package/dist/auth/device-flow.js +141 -0
- package/dist/auth/device-flow.js.map +1 -0
- package/dist/auth/http-auth.d.ts +25 -0
- package/dist/auth/http-auth.d.ts.map +1 -0
- package/dist/auth/http-auth.js +101 -0
- package/dist/auth/http-auth.js.map +1 -0
- package/dist/auth/jwt-validator.d.ts +20 -0
- package/dist/auth/jwt-validator.d.ts.map +1 -0
- package/dist/auth/jwt-validator.js +83 -0
- package/dist/auth/jwt-validator.js.map +1 -0
- package/dist/auth/token-storage.d.ts +88 -0
- package/dist/auth/token-storage.d.ts.map +1 -0
- package/dist/auth/token-storage.js +273 -0
- package/dist/auth/token-storage.js.map +1 -0
- package/dist/clients/hasura-client.d.ts +33 -0
- package/dist/clients/hasura-client.d.ts.map +1 -0
- package/dist/clients/hasura-client.js +79 -0
- package/dist/clients/hasura-client.js.map +1 -0
- package/dist/config/environments.d.ts +51 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +183 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +593 -0
- package/dist/index.js.map +1 -0
- package/dist/server/http-server.d.ts +14 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +167 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/mcp-core.d.ts +12 -0
- package/dist/server/mcp-core.d.ts.map +1 -0
- package/dist/server/mcp-core.js +200 -0
- package/dist/server/mcp-core.js.map +1 -0
- package/dist/tools/acuity-init.d.ts +84 -0
- package/dist/tools/acuity-init.d.ts.map +1 -0
- package/dist/tools/acuity-init.js +239 -0
- package/dist/tools/acuity-init.js.map +1 -0
- package/dist/tools/get-dashboard-summary.d.ts +96 -0
- package/dist/tools/get-dashboard-summary.d.ts.map +1 -0
- package/dist/tools/get-dashboard-summary.js +264 -0
- package/dist/tools/get-dashboard-summary.js.map +1 -0
- package/dist/tools/get-issue.d.ts +62 -0
- package/dist/tools/get-issue.d.ts.map +1 -0
- package/dist/tools/get-issue.js +150 -0
- package/dist/tools/get-issue.js.map +1 -0
- package/dist/tools/get-lesson-learned.d.ts +53 -0
- package/dist/tools/get-lesson-learned.d.ts.map +1 -0
- package/dist/tools/get-lesson-learned.js +117 -0
- package/dist/tools/get-lesson-learned.js.map +1 -0
- package/dist/tools/get-lookup-values.d.ts +41 -0
- package/dist/tools/get-lookup-values.d.ts.map +1 -0
- package/dist/tools/get-lookup-values.js +127 -0
- package/dist/tools/get-lookup-values.js.map +1 -0
- package/dist/tools/get-project.d.ts +131 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +340 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-risk.d.ts +65 -0
- package/dist/tools/get-risk.d.ts.map +1 -0
- package/dist/tools/get-risk.js +173 -0
- package/dist/tools/get-risk.js.map +1 -0
- package/dist/tools/get-status-reports.d.ts +46 -0
- package/dist/tools/get-status-reports.d.ts.map +1 -0
- package/dist/tools/get-status-reports.js +151 -0
- package/dist/tools/get-status-reports.js.map +1 -0
- package/dist/tools/init-auth.d.ts +47 -0
- package/dist/tools/init-auth.d.ts.map +1 -0
- package/dist/tools/init-auth.js +213 -0
- package/dist/tools/init-auth.js.map +1 -0
- package/dist/tools/list-issues.d.ts +134 -0
- package/dist/tools/list-issues.d.ts.map +1 -0
- package/dist/tools/list-issues.js +285 -0
- package/dist/tools/list-issues.js.map +1 -0
- package/dist/tools/list-lessons-learned.d.ts +79 -0
- package/dist/tools/list-lessons-learned.d.ts.map +1 -0
- package/dist/tools/list-lessons-learned.js +155 -0
- package/dist/tools/list-lessons-learned.js.map +1 -0
- package/dist/tools/list-projects.d.ts +200 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +396 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-risks.d.ts +166 -0
- package/dist/tools/list-risks.d.ts.map +1 -0
- package/dist/tools/list-risks.js +356 -0
- package/dist/tools/list-risks.js.map +1 -0
- package/dist/tools/search-projects.d.ts +90 -0
- package/dist/tools/search-projects.d.ts.map +1 -0
- package/dist/tools/search-projects.js +191 -0
- package/dist/tools/search-projects.js.map +1 -0
- package/dist/utils/formatters.d.ts +12 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +28 -0
- package/dist/utils/formatters.js.map +1 -0
- package/openapi.yaml +194 -0
- package/package.json +68 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server for Acuity MCP
|
|
3
|
+
* Implements Streamable HTTP transport for remote clients (Copilot, Claude, etc.)
|
|
4
|
+
*/
|
|
5
|
+
import express from 'express';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
8
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { validateHttpAuth } from '../auth/http-auth.js';
|
|
10
|
+
import { createMcpServer } from './mcp-core.js';
|
|
11
|
+
// Store active sessions
|
|
12
|
+
const sessions = new Map();
|
|
13
|
+
// Session timeout (30 minutes)
|
|
14
|
+
const SESSION_TIMEOUT_MS = 30 * 60 * 1000;
|
|
15
|
+
/**
|
|
16
|
+
* Clean up expired sessions periodically
|
|
17
|
+
*/
|
|
18
|
+
function startSessionCleanup() {
|
|
19
|
+
setInterval(() => {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
for (const [sessionId, session] of sessions.entries()) {
|
|
22
|
+
if (now - session.createdAt.getTime() > SESSION_TIMEOUT_MS) {
|
|
23
|
+
console.log(`[HTTP] Cleaning up expired session: ${sessionId}`);
|
|
24
|
+
session.transport.close();
|
|
25
|
+
sessions.delete(sessionId);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}, 60000); // Check every minute
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create and configure Express app for MCP HTTP server
|
|
32
|
+
*/
|
|
33
|
+
export function createHttpServer() {
|
|
34
|
+
const app = express();
|
|
35
|
+
// Parse JSON bodies
|
|
36
|
+
app.use(express.json());
|
|
37
|
+
// Health check endpoint (no auth required)
|
|
38
|
+
app.get('/health', (_req, res) => {
|
|
39
|
+
res.json({
|
|
40
|
+
status: 'ok',
|
|
41
|
+
service: 'acuity-mcp-server',
|
|
42
|
+
activeSessions: sessions.size
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
// OpenAPI schema endpoint (no auth required)
|
|
46
|
+
app.get('/openapi.yaml', (_req, res) => {
|
|
47
|
+
res.sendFile('openapi.yaml', { root: process.cwd() });
|
|
48
|
+
});
|
|
49
|
+
// MCP endpoint - POST (handle requests)
|
|
50
|
+
app.post('/mcp', validateHttpAuth, async (req, res) => {
|
|
51
|
+
const authReq = req;
|
|
52
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
53
|
+
try {
|
|
54
|
+
let session = sessionId ? sessions.get(sessionId) : undefined;
|
|
55
|
+
if (session) {
|
|
56
|
+
// Reuse existing session
|
|
57
|
+
await session.transport.handleRequest(req, res, req.body);
|
|
58
|
+
}
|
|
59
|
+
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
60
|
+
// Create new session
|
|
61
|
+
const newSessionId = randomUUID();
|
|
62
|
+
const transport = new StreamableHTTPServerTransport({
|
|
63
|
+
sessionIdGenerator: () => newSessionId,
|
|
64
|
+
onsessioninitialized: (id) => {
|
|
65
|
+
console.log(`[HTTP] Session initialized: ${id} for user: ${authReq.userEmail}`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// Create MCP server instance for this session
|
|
69
|
+
const server = createMcpServer(authReq.userEmail, authReq.userToken);
|
|
70
|
+
// Store session
|
|
71
|
+
sessions.set(newSessionId, {
|
|
72
|
+
transport,
|
|
73
|
+
server,
|
|
74
|
+
email: authReq.userEmail,
|
|
75
|
+
createdAt: new Date()
|
|
76
|
+
});
|
|
77
|
+
// Handle transport close
|
|
78
|
+
transport.onclose = () => {
|
|
79
|
+
console.log(`[HTTP] Transport closed for session: ${newSessionId}`);
|
|
80
|
+
sessions.delete(newSessionId);
|
|
81
|
+
};
|
|
82
|
+
// Connect server to transport
|
|
83
|
+
await server.connect(transport);
|
|
84
|
+
// Handle the initialize request
|
|
85
|
+
await transport.handleRequest(req, res, req.body);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Invalid request - no session and not an initialize request
|
|
89
|
+
res.status(400).json({
|
|
90
|
+
jsonrpc: '2.0',
|
|
91
|
+
error: {
|
|
92
|
+
code: -32000,
|
|
93
|
+
message: 'Invalid session. Send initialize request first or include valid mcp-session-id header.'
|
|
94
|
+
},
|
|
95
|
+
id: null
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error('[HTTP] Error handling POST /mcp:', error);
|
|
101
|
+
res.status(500).json({
|
|
102
|
+
jsonrpc: '2.0',
|
|
103
|
+
error: {
|
|
104
|
+
code: -32603,
|
|
105
|
+
message: error instanceof Error ? error.message : 'Internal error'
|
|
106
|
+
},
|
|
107
|
+
id: null
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// MCP endpoint - GET (SSE stream for server-to-client messages)
|
|
112
|
+
app.get('/mcp', validateHttpAuth, async (req, res) => {
|
|
113
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
114
|
+
const session = sessions.get(sessionId);
|
|
115
|
+
if (!session) {
|
|
116
|
+
res.status(400).json({
|
|
117
|
+
jsonrpc: '2.0',
|
|
118
|
+
error: { code: -32000, message: 'Invalid or missing session' },
|
|
119
|
+
id: null
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
await session.transport.handleRequest(req, res);
|
|
124
|
+
});
|
|
125
|
+
// MCP endpoint - DELETE (close session)
|
|
126
|
+
app.delete('/mcp', validateHttpAuth, async (req, res) => {
|
|
127
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
128
|
+
const session = sessions.get(sessionId);
|
|
129
|
+
if (session) {
|
|
130
|
+
await session.transport.handleRequest(req, res);
|
|
131
|
+
sessions.delete(sessionId);
|
|
132
|
+
console.log(`[HTTP] Session deleted: ${sessionId}`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
res.status(400).json({
|
|
136
|
+
jsonrpc: '2.0',
|
|
137
|
+
error: { code: -32000, message: 'Invalid or missing session' },
|
|
138
|
+
id: null
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Error handling middleware
|
|
143
|
+
app.use((err, _req, res, _next) => {
|
|
144
|
+
console.error('[HTTP] Unhandled error:', err);
|
|
145
|
+
res.status(500).json({
|
|
146
|
+
jsonrpc: '2.0',
|
|
147
|
+
error: { code: -32603, message: 'Internal server error' },
|
|
148
|
+
id: null
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
// Start session cleanup
|
|
152
|
+
startSessionCleanup();
|
|
153
|
+
return app;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Start HTTP server on specified port
|
|
157
|
+
*/
|
|
158
|
+
export async function startHttpServer(port) {
|
|
159
|
+
const app = createHttpServer();
|
|
160
|
+
app.listen(port, () => {
|
|
161
|
+
console.log(`[HTTP] Acuity MCP Server listening on port ${port}`);
|
|
162
|
+
console.log(`[HTTP] MCP endpoint: http://localhost:${port}/mcp`);
|
|
163
|
+
console.log(`[HTTP] Health check: http://localhost:${port}/health`);
|
|
164
|
+
console.log(`[HTTP] OpenAPI schema: http://localhost:${port}/openapi.yaml`);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Core
|
|
3
|
+
* Shared MCP server logic used by both stdio and HTTP transports
|
|
4
|
+
*/
|
|
5
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create MCP server instance with all tools configured
|
|
8
|
+
* For HTTP mode: email and token are provided from HTTP auth
|
|
9
|
+
* For stdio mode: email and token are retrieved from keychain/env
|
|
10
|
+
*/
|
|
11
|
+
export declare function createMcpServer(userEmail: string, userToken: string): Server;
|
|
12
|
+
//# sourceMappingURL=mcp-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-core.d.ts","sourceRoot":"","sources":["../../src/server/mcp-core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAoBnE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CA2OR"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Core
|
|
3
|
+
* Shared MCP server logic used by both stdio and HTTP transports
|
|
4
|
+
*/
|
|
5
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { HasuraClient } from '../clients/hasura-client.js';
|
|
8
|
+
import { acuityInit, acuityInitTool } from '../tools/acuity-init.js';
|
|
9
|
+
import { listProjects, listProjectsTool } from '../tools/list-projects.js';
|
|
10
|
+
import { getProject, getProjectTool } from '../tools/get-project.js';
|
|
11
|
+
import { getStatusReports, getStatusReportsTool } from '../tools/get-status-reports.js';
|
|
12
|
+
import { listRisks, listRisksTool } from '../tools/list-risks.js';
|
|
13
|
+
import { getRisk, getRiskTool } from '../tools/get-risk.js';
|
|
14
|
+
import { listIssues, listIssuesTool } from '../tools/list-issues.js';
|
|
15
|
+
import { getIssue, getIssueTool } from '../tools/get-issue.js';
|
|
16
|
+
import { listLessonsLearned, listLessonsLearnedTool } from '../tools/list-lessons-learned.js';
|
|
17
|
+
import { getLessonLearned, getLessonLearnedTool } from '../tools/get-lesson-learned.js';
|
|
18
|
+
import { getLookupValues, getLookupValuesTool } from '../tools/get-lookup-values.js';
|
|
19
|
+
import { searchProjects, searchProjectsTool } from '../tools/search-projects.js';
|
|
20
|
+
import { getDashboardSummary, getDashboardSummaryTool } from '../tools/get-dashboard-summary.js';
|
|
21
|
+
/**
|
|
22
|
+
* Create MCP server instance with all tools configured
|
|
23
|
+
* For HTTP mode: email and token are provided from HTTP auth
|
|
24
|
+
* For stdio mode: email and token are retrieved from keychain/env
|
|
25
|
+
*/
|
|
26
|
+
export function createMcpServer(userEmail, userToken) {
|
|
27
|
+
// Create Hasura client for this user
|
|
28
|
+
const hasuraClient = HasuraClient.forUser(userEmail, userToken);
|
|
29
|
+
// Session state for this server instance
|
|
30
|
+
let sessionInitData = null;
|
|
31
|
+
// Create server instance
|
|
32
|
+
const server = new Server({
|
|
33
|
+
name: 'acuity-mcp-server',
|
|
34
|
+
version: '1.0.0'
|
|
35
|
+
}, {
|
|
36
|
+
capabilities: {
|
|
37
|
+
tools: {}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* List available tools
|
|
42
|
+
* Note: For HTTP mode, we don't expose auth tools (acuity_login, acuity_logout, acuity_auth_status)
|
|
43
|
+
* because authentication is handled via HTTP headers
|
|
44
|
+
*/
|
|
45
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
46
|
+
return {
|
|
47
|
+
tools: [
|
|
48
|
+
acuityInitTool,
|
|
49
|
+
listProjectsTool,
|
|
50
|
+
getProjectTool,
|
|
51
|
+
searchProjectsTool,
|
|
52
|
+
getStatusReportsTool,
|
|
53
|
+
listRisksTool,
|
|
54
|
+
getRiskTool,
|
|
55
|
+
listIssuesTool,
|
|
56
|
+
getIssueTool,
|
|
57
|
+
listLessonsLearnedTool,
|
|
58
|
+
getLessonLearnedTool,
|
|
59
|
+
getLookupValuesTool,
|
|
60
|
+
getDashboardSummaryTool
|
|
61
|
+
]
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* Handle tool execution
|
|
66
|
+
*/
|
|
67
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
68
|
+
const { name } = request.params;
|
|
69
|
+
try {
|
|
70
|
+
// Helper: auto-initialize if needed
|
|
71
|
+
async function ensureInitialized() {
|
|
72
|
+
if (!sessionInitData) {
|
|
73
|
+
sessionInitData = await acuityInit(hasuraClient);
|
|
74
|
+
}
|
|
75
|
+
return sessionInitData;
|
|
76
|
+
}
|
|
77
|
+
switch (name) {
|
|
78
|
+
case 'acuity_init': {
|
|
79
|
+
// Always refresh on explicit call
|
|
80
|
+
sessionInitData = await acuityInit(hasuraClient);
|
|
81
|
+
const d = sessionInitData;
|
|
82
|
+
const summary = `✅ Acuity initialized
|
|
83
|
+
|
|
84
|
+
Company: ${d.company}
|
|
85
|
+
Currency: ${d.currency_code} (${d.currency_locale})
|
|
86
|
+
|
|
87
|
+
Data available:
|
|
88
|
+
• Projects: ${d.entities.projects.count} | Proposals: ${d.entities.proposals.count}
|
|
89
|
+
• Risks: ${d.entities.project_risks.count} (project) + ${d.entities.proposal_risks.count} (proposal)
|
|
90
|
+
• Issues: ${d.entities.project_issues.count} (project) + ${d.entities.proposal_issues.count} (proposal)
|
|
91
|
+
• Lessons: ${d.entities.lessons_learned.count}
|
|
92
|
+
• Status Reports: ${d.entities.status_reports.count}
|
|
93
|
+
|
|
94
|
+
Lookups: ${d.lookup_tables.departments} departments, ${d.lookup_tables.categories} categories, ${d.lookup_tables.lifecycles} lifecycles`;
|
|
95
|
+
return {
|
|
96
|
+
content: [{ type: 'text', text: summary }]
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
case 'list_projects': {
|
|
100
|
+
const initData = await ensureInitialized();
|
|
101
|
+
const listResult = await listProjects(request.params.arguments, hasuraClient);
|
|
102
|
+
const response = sessionInitData === initData && !request.params.arguments
|
|
103
|
+
? { _context: initData, ...listResult }
|
|
104
|
+
: listResult;
|
|
105
|
+
return {
|
|
106
|
+
content: [{ type: 'text', text: JSON.stringify(response, null, 2) }]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
case 'get_project': {
|
|
110
|
+
await ensureInitialized();
|
|
111
|
+
const projectResult = await getProject(request.params.arguments, hasuraClient);
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: 'text', text: JSON.stringify(projectResult, null, 2) }]
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
case 'search_projects': {
|
|
117
|
+
await ensureInitialized();
|
|
118
|
+
const searchResult = await searchProjects(request.params.arguments, hasuraClient);
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: 'text', text: JSON.stringify(searchResult, null, 2) }]
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
case 'get_status_reports': {
|
|
124
|
+
await ensureInitialized();
|
|
125
|
+
const statusReportsText = await getStatusReports(request.params.arguments, hasuraClient);
|
|
126
|
+
return {
|
|
127
|
+
content: [{ type: 'text', text: statusReportsText }]
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
case 'list_risks': {
|
|
131
|
+
await ensureInitialized();
|
|
132
|
+
const risksResult = await listRisks(request.params.arguments, hasuraClient);
|
|
133
|
+
return {
|
|
134
|
+
content: [{ type: 'text', text: JSON.stringify(risksResult, null, 2) }]
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
case 'get_risk': {
|
|
138
|
+
await ensureInitialized();
|
|
139
|
+
const riskResult = await getRisk(request.params.arguments, hasuraClient);
|
|
140
|
+
return {
|
|
141
|
+
content: [{ type: 'text', text: JSON.stringify(riskResult, null, 2) }]
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
case 'list_issues': {
|
|
145
|
+
await ensureInitialized();
|
|
146
|
+
const issuesResult = await listIssues(request.params.arguments, hasuraClient);
|
|
147
|
+
return {
|
|
148
|
+
content: [{ type: 'text', text: JSON.stringify(issuesResult, null, 2) }]
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
case 'get_issue': {
|
|
152
|
+
await ensureInitialized();
|
|
153
|
+
const issueResult = await getIssue(request.params.arguments, hasuraClient);
|
|
154
|
+
return {
|
|
155
|
+
content: [{ type: 'text', text: JSON.stringify(issueResult, null, 2) }]
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
case 'list_lessons_learned': {
|
|
159
|
+
await ensureInitialized();
|
|
160
|
+
const lessonsResult = await listLessonsLearned(request.params.arguments, hasuraClient);
|
|
161
|
+
return {
|
|
162
|
+
content: [{ type: 'text', text: JSON.stringify(lessonsResult, null, 2) }]
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
case 'get_lesson_learned': {
|
|
166
|
+
await ensureInitialized();
|
|
167
|
+
const lessonResult = await getLessonLearned(request.params.arguments, hasuraClient);
|
|
168
|
+
return {
|
|
169
|
+
content: [{ type: 'text', text: JSON.stringify(lessonResult, null, 2) }]
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
case 'get_lookup_values': {
|
|
173
|
+
await ensureInitialized();
|
|
174
|
+
const lookupResult = await getLookupValues(request.params.arguments, hasuraClient);
|
|
175
|
+
return {
|
|
176
|
+
content: [{ type: 'text', text: JSON.stringify(lookupResult, null, 2) }]
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
case 'get_dashboard_summary': {
|
|
180
|
+
await ensureInitialized();
|
|
181
|
+
const dashboardResult = await getDashboardSummary(request.params.arguments, hasuraClient);
|
|
182
|
+
return {
|
|
183
|
+
content: [{ type: 'text', text: JSON.stringify(dashboardResult, null, 2) }]
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
default:
|
|
187
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
192
|
+
return {
|
|
193
|
+
content: [{ type: 'text', text: `Error: ${errorMessage}` }],
|
|
194
|
+
isError: true
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return server;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=mcp-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-core.js","sourceRoot":"","sources":["../../src/server/mcp-core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAyB,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjG;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,SAAiB;IAEjB,qCAAqC;IACrC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEhE,yCAAyC;IACzC,IAAI,eAAe,GAA4B,IAAI,CAAC;IAEpD,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE;gBACL,cAAc;gBACd,gBAAgB;gBAChB,cAAc;gBACd,kBAAkB;gBAClB,oBAAoB;gBACpB,aAAa;gBACb,WAAW;gBACX,cAAc;gBACd,YAAY;gBACZ,sBAAsB;gBACtB,oBAAoB;gBACpB,mBAAmB;gBACnB,uBAAuB;aACxB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEhC,IAAI,CAAC;YACH,oCAAoC;YACpC,KAAK,UAAU,iBAAiB;gBAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,eAAe,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;gBACnD,CAAC;gBACD,OAAO,eAAe,CAAC;YACzB,CAAC;YAED,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,kCAAkC;oBAClC,eAAe,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;oBAEjD,MAAM,CAAC,GAAG,eAAe,CAAC;oBAC1B,MAAM,OAAO,GAAG;;WAEf,CAAC,CAAC,OAAO;YACR,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,eAAe;;;cAGnC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK;WACvE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,gBAAgB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK;YAC5E,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,gBAAgB,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK;aAC9E,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK;oBACzB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK;;WAExC,CAAC,CAAC,aAAa,CAAC,WAAW,iBAAiB,CAAC,CAAC,aAAa,CAAC,UAAU,gBAAgB,CAAC,CAAC,aAAa,CAAC,UAAU,aAAa,CAAC;oBAE/H,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;qBAC3C,CAAC;gBACJ,CAAC;gBAED,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;oBAC3C,MAAM,UAAU,GAAG,MAAM,YAAY,CACnC,OAAO,CAAC,MAAM,CAAC,SAA+C,EAC9D,YAAY,CACb,CAAC;oBAEF,MAAM,QAAQ,GAAG,eAAe,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;wBACxE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE;wBACvC,CAAC,CAAC,UAAU,CAAC;oBAEf,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACrE,CAAC;gBACJ,CAAC;gBAED,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,aAAa,GAAG,MAAM,UAAU,CACpC,OAAO,CAAC,MAAM,CAAC,SAA6C,EAC5D,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBAC1E,CAAC;gBACJ,CAAC;gBAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;oBACvB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,MAAM,cAAc,CACvC,OAAO,CAAC,MAAM,CAAC,SAA4D,EAC3E,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACzE,CAAC;gBACJ,CAAC;gBAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;oBAC1B,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,iBAAiB,GAAG,MAAM,gBAAgB,CAC9C,OAAO,CAAC,MAAM,CAAC,SAAmD,EAClE,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;qBACrD,CAAC;gBACJ,CAAC;gBAED,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,WAAW,GAAG,MAAM,SAAS,CACjC,OAAO,CAAC,MAAM,CAAC,SAA4C,EAC3D,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACxE,CAAC;gBACJ,CAAC;gBAED,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,UAAU,GAAG,MAAM,OAAO,CAC9B,OAAO,CAAC,MAAM,CAAC,SAA0C,EACzD,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACvE,CAAC;gBACJ,CAAC;gBAED,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,MAAM,UAAU,CACnC,OAAO,CAAC,MAAM,CAAC,SAA6C,EAC5D,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACzE,CAAC;gBACJ,CAAC;gBAED,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,OAAO,CAAC,MAAM,CAAC,SAA2C,EAC1D,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACxE,CAAC;gBACJ,CAAC;gBAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;oBAC5B,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,OAAO,CAAC,MAAM,CAAC,SAAqD,EACpE,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBAC1E,CAAC;gBACJ,CAAC;gBAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;oBAC1B,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,MAAM,gBAAgB,CACzC,OAAO,CAAC,MAAM,CAAC,SAAmD,EAClE,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACzE,CAAC;gBACJ,CAAC;gBAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,MAAM,eAAe,CACxC,OAAO,CAAC,MAAM,CAAC,SAA6D,EAC5E,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACzE,CAAC;gBACJ,CAAC;gBAED,KAAK,uBAAuB,CAAC,CAAC,CAAC;oBAC7B,MAAM,iBAAiB,EAAE,CAAC;oBAC1B,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAC/C,OAAO,CAAC,MAAM,CAAC,SAAsD,EACrE,YAAY,CACb,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBAC5E,CAAC;gBACJ,CAAC;gBAED;oBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,YAAY,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: acuity_init
|
|
3
|
+
* Initializes LLM context with minimal schema information
|
|
4
|
+
*
|
|
5
|
+
* Returns:
|
|
6
|
+
* - Company name
|
|
7
|
+
* - Entity counts (projects, risks, issues, lessons_learned, status_reports)
|
|
8
|
+
* - All enum values for filtering
|
|
9
|
+
* - Lookup table counts
|
|
10
|
+
* - Available tools
|
|
11
|
+
*
|
|
12
|
+
* This tool should be called first to give LLM understanding of available data.
|
|
13
|
+
* Target size: ~700-800 tokens
|
|
14
|
+
*/
|
|
15
|
+
import type { HasuraClient } from '../clients/hasura-client.js';
|
|
16
|
+
export interface AcuityInitResult {
|
|
17
|
+
company: string;
|
|
18
|
+
currency_code: string;
|
|
19
|
+
currency_locale: string;
|
|
20
|
+
entities: {
|
|
21
|
+
projects: {
|
|
22
|
+
count: number;
|
|
23
|
+
description: string;
|
|
24
|
+
filterable_by: string[];
|
|
25
|
+
has_counts: string[];
|
|
26
|
+
related: string[];
|
|
27
|
+
};
|
|
28
|
+
proposals: {
|
|
29
|
+
count: number;
|
|
30
|
+
description: string;
|
|
31
|
+
filterable_by: string[];
|
|
32
|
+
related: string[];
|
|
33
|
+
};
|
|
34
|
+
project_risks: {
|
|
35
|
+
count: number;
|
|
36
|
+
description: string;
|
|
37
|
+
filterable_by: string[];
|
|
38
|
+
};
|
|
39
|
+
proposal_risks: {
|
|
40
|
+
count: number;
|
|
41
|
+
description: string;
|
|
42
|
+
filterable_by: string[];
|
|
43
|
+
};
|
|
44
|
+
project_issues: {
|
|
45
|
+
count: number;
|
|
46
|
+
description: string;
|
|
47
|
+
filterable_by: string[];
|
|
48
|
+
};
|
|
49
|
+
proposal_issues: {
|
|
50
|
+
count: number;
|
|
51
|
+
description: string;
|
|
52
|
+
filterable_by: string[];
|
|
53
|
+
};
|
|
54
|
+
lessons_learned: {
|
|
55
|
+
count: number;
|
|
56
|
+
description: string;
|
|
57
|
+
filterable_by: string[];
|
|
58
|
+
};
|
|
59
|
+
status_reports: {
|
|
60
|
+
count: number;
|
|
61
|
+
description: string;
|
|
62
|
+
filterable_by: string[];
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
enums: Record<string, string[] | string>;
|
|
66
|
+
lookup_tables: Record<string, number>;
|
|
67
|
+
available_tools: string[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Acuity init handler
|
|
71
|
+
*/
|
|
72
|
+
export declare function acuityInit(hasuraClient: HasuraClient): Promise<AcuityInitResult>;
|
|
73
|
+
/**
|
|
74
|
+
* MCP tool definition for acuity_init
|
|
75
|
+
*/
|
|
76
|
+
export declare const acuityInitTool: {
|
|
77
|
+
name: string;
|
|
78
|
+
description: string;
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: string;
|
|
81
|
+
properties: {};
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=acuity-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acuity-init.d.ts","sourceRoot":"","sources":["../../src/tools/acuity-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IAExB,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,aAAa,EAAE;YACb,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,cAAc,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,cAAc,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,eAAe,EAAE;YACf,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,eAAe,EAAE;YACf,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,cAAc,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;KACH,CAAC;IAEF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;IAEzC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA8FD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAoI3B;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;CAwB1B,CAAC"}
|