@west10tech/constructionwire-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/README.md +177 -0
- package/dist/clients/constructionwire-client.d.ts +110 -0
- package/dist/clients/constructionwire-client.d.ts.map +1 -0
- package/dist/clients/constructionwire-client.js +16746 -0
- package/dist/clients/constructionwire-client.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/dist/services/log-batcher.d.ts +44 -0
- package/dist/services/log-batcher.d.ts.map +1 -0
- package/dist/services/log-batcher.js +81 -0
- package/dist/services/log-batcher.js.map +1 -0
- package/dist/services/log-shipper.d.ts +104 -0
- package/dist/services/log-shipper.d.ts.map +1 -0
- package/dist/services/log-shipper.js +384 -0
- package/dist/services/log-shipper.js.map +1 -0
- package/dist/services/logger.d.ts +92 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +224 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/progress-reporter.d.ts +64 -0
- package/dist/services/progress-reporter.d.ts.map +1 -0
- package/dist/services/progress-reporter.js +192 -0
- package/dist/services/progress-reporter.js.map +1 -0
- package/dist/services/request-tracker.d.ts +55 -0
- package/dist/services/request-tracker.d.ts.map +1 -0
- package/dist/services/request-tracker.js +184 -0
- package/dist/services/request-tracker.js.map +1 -0
- package/dist/tools/constructionwire-tools.d.ts +23 -0
- package/dist/tools/constructionwire-tools.d.ts.map +1 -0
- package/dist/tools/constructionwire-tools.js +8973 -0
- package/dist/tools/constructionwire-tools.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
export class RequestTracker {
|
|
2
|
+
constructor(logger) {
|
|
3
|
+
this.activeRequests = new Map();
|
|
4
|
+
this.progressTokens = new Map();
|
|
5
|
+
this.logger = logger;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Register a new request for tracking
|
|
9
|
+
*/
|
|
10
|
+
registerRequest(requestId, progressToken, toolName) {
|
|
11
|
+
// Check if request already exists
|
|
12
|
+
if (this.activeRequests.has(requestId)) {
|
|
13
|
+
this.logger.warn('REQUEST_DUPLICATE', 'Request ID already registered', {
|
|
14
|
+
requestId,
|
|
15
|
+
existing: true
|
|
16
|
+
});
|
|
17
|
+
return this.activeRequests.get(requestId);
|
|
18
|
+
}
|
|
19
|
+
const context = {
|
|
20
|
+
requestId,
|
|
21
|
+
abortController: new AbortController(),
|
|
22
|
+
progressToken,
|
|
23
|
+
startTime: Date.now(),
|
|
24
|
+
toolName
|
|
25
|
+
};
|
|
26
|
+
this.activeRequests.set(requestId, context);
|
|
27
|
+
// Map progress token to request ID if provided
|
|
28
|
+
if (progressToken !== undefined) {
|
|
29
|
+
this.progressTokens.set(progressToken, requestId);
|
|
30
|
+
}
|
|
31
|
+
this.logger.info('REQUEST_REGISTERED', 'New request registered for tracking', {
|
|
32
|
+
requestId,
|
|
33
|
+
hasProgressToken: !!progressToken,
|
|
34
|
+
toolName,
|
|
35
|
+
activeRequestCount: this.activeRequests.size
|
|
36
|
+
});
|
|
37
|
+
return context;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get request context by ID
|
|
41
|
+
*/
|
|
42
|
+
getRequest(requestId) {
|
|
43
|
+
return this.activeRequests.get(requestId);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get request context by progress token
|
|
47
|
+
*/
|
|
48
|
+
getRequestByProgressToken(progressToken) {
|
|
49
|
+
const requestId = this.progressTokens.get(progressToken);
|
|
50
|
+
if (!requestId) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return this.activeRequests.get(requestId);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Cancel a request
|
|
57
|
+
*/
|
|
58
|
+
cancelRequest(requestId, reason) {
|
|
59
|
+
const context = this.activeRequests.get(requestId);
|
|
60
|
+
if (!context) {
|
|
61
|
+
this.logger.debug('CANCEL_REQUEST_NOT_FOUND', 'Request not found for cancellation', {
|
|
62
|
+
requestId,
|
|
63
|
+
reason,
|
|
64
|
+
activeRequestCount: this.activeRequests.size
|
|
65
|
+
});
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// Check if already aborted
|
|
69
|
+
if (context.abortController.signal.aborted) {
|
|
70
|
+
this.logger.debug('CANCEL_REQUEST_ALREADY_ABORTED', 'Request already cancelled', {
|
|
71
|
+
requestId,
|
|
72
|
+
reason
|
|
73
|
+
});
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// Abort the request
|
|
77
|
+
context.abortController.abort(reason);
|
|
78
|
+
const duration = Date.now() - context.startTime;
|
|
79
|
+
this.logger.info('REQUEST_CANCELLED', 'Request cancelled successfully', {
|
|
80
|
+
requestId,
|
|
81
|
+
reason,
|
|
82
|
+
duration_ms: duration,
|
|
83
|
+
toolName: context.toolName,
|
|
84
|
+
hadProgressToken: !!context.progressToken
|
|
85
|
+
});
|
|
86
|
+
// Clean up immediately after cancellation
|
|
87
|
+
this.cleanup(requestId);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Clean up a completed or cancelled request
|
|
92
|
+
*/
|
|
93
|
+
cleanup(requestId) {
|
|
94
|
+
const context = this.activeRequests.get(requestId);
|
|
95
|
+
if (!context) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Remove progress token mapping if exists
|
|
99
|
+
if (context.progressToken !== undefined) {
|
|
100
|
+
this.progressTokens.delete(context.progressToken);
|
|
101
|
+
}
|
|
102
|
+
// Remove from active requests
|
|
103
|
+
this.activeRequests.delete(requestId);
|
|
104
|
+
const duration = Date.now() - context.startTime;
|
|
105
|
+
this.logger.debug('REQUEST_CLEANUP', 'Request cleaned up', {
|
|
106
|
+
requestId,
|
|
107
|
+
duration_ms: duration,
|
|
108
|
+
toolName: context.toolName,
|
|
109
|
+
remainingRequests: this.activeRequests.size
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a request is still active
|
|
114
|
+
*/
|
|
115
|
+
isActive(requestId) {
|
|
116
|
+
const context = this.activeRequests.get(requestId);
|
|
117
|
+
return !!context && !context.abortController.signal.aborted;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if a progress token is valid and active
|
|
121
|
+
*/
|
|
122
|
+
isProgressTokenActive(progressToken) {
|
|
123
|
+
const requestId = this.progressTokens.get(progressToken);
|
|
124
|
+
if (!requestId) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return this.isActive(requestId);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get all active request IDs
|
|
131
|
+
*/
|
|
132
|
+
getActiveRequestIds() {
|
|
133
|
+
return Array.from(this.activeRequests.keys());
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clean up old requests (called periodically)
|
|
137
|
+
*/
|
|
138
|
+
cleanupStaleRequests(maxAgeMs = 300000) {
|
|
139
|
+
const now = Date.now();
|
|
140
|
+
let cleanedCount = 0;
|
|
141
|
+
for (const [requestId, context] of this.activeRequests.entries()) {
|
|
142
|
+
const age = now - context.startTime;
|
|
143
|
+
if (age > maxAgeMs) {
|
|
144
|
+
this.logger.warn('REQUEST_STALE', 'Cleaning up stale request', {
|
|
145
|
+
requestId,
|
|
146
|
+
age_ms: age,
|
|
147
|
+
maxAge_ms: maxAgeMs,
|
|
148
|
+
toolName: context.toolName
|
|
149
|
+
});
|
|
150
|
+
// Cancel if still active
|
|
151
|
+
if (!context.abortController.signal.aborted) {
|
|
152
|
+
context.abortController.abort('Request timed out');
|
|
153
|
+
}
|
|
154
|
+
this.cleanup(requestId);
|
|
155
|
+
cleanedCount++;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (cleanedCount > 0) {
|
|
159
|
+
this.logger.info('STALE_CLEANUP_COMPLETE', 'Cleaned up stale requests', {
|
|
160
|
+
cleanedCount,
|
|
161
|
+
remainingRequests: this.activeRequests.size
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return cleanedCount;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Shutdown and clean up all requests
|
|
168
|
+
*/
|
|
169
|
+
shutdown() {
|
|
170
|
+
this.logger.info('REQUEST_TRACKER_SHUTDOWN', 'Shutting down request tracker', {
|
|
171
|
+
activeRequests: this.activeRequests.size
|
|
172
|
+
});
|
|
173
|
+
// Cancel all active requests
|
|
174
|
+
for (const [requestId, context] of this.activeRequests.entries()) {
|
|
175
|
+
if (!context.abortController.signal.aborted) {
|
|
176
|
+
context.abortController.abort('Server shutting down');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Clear all maps
|
|
180
|
+
this.activeRequests.clear();
|
|
181
|
+
this.progressTokens.clear();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=request-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-tracker.js","sourceRoot":"","sources":["../../src/services/request-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ConstructionwireClient } from '../clients/constructionwire-client.js';
|
|
2
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { Logger } from '../services/logger.js';
|
|
4
|
+
import { RequestContext } from '../services/request-tracker.js';
|
|
5
|
+
import { ProgressReporter } from '../services/progress-reporter.js';
|
|
6
|
+
export interface ConstructionwireToolsConfig {
|
|
7
|
+
cONSTRUCTIONWIREUSERNAME?: string;
|
|
8
|
+
cONSTRUCTIONWIREPASSWORD?: string;
|
|
9
|
+
api_base_url?: any;
|
|
10
|
+
authToken?: string;
|
|
11
|
+
logger?: Logger;
|
|
12
|
+
}
|
|
13
|
+
export declare class ConstructionwireTools {
|
|
14
|
+
private client;
|
|
15
|
+
private initialized;
|
|
16
|
+
private logger;
|
|
17
|
+
constructor(client: ConstructionwireClient);
|
|
18
|
+
private ensureInitialized;
|
|
19
|
+
getToolDefinitions(): Tool[];
|
|
20
|
+
canHandle(toolName: string): boolean;
|
|
21
|
+
executeTool(name: string, args: any, context?: RequestContext, progressReporter?: ProgressReporter): Promise<any>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=constructionwire-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructionwire-tools.d.ts","sourceRoot":"","sources":["../../src/tools/constructionwire-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,WAAW,2BAA2B;IAC1C,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,sBAAsB;YAe5B,iBAAiB;IAoB/B,kBAAkB,IAAI,IAAI,EAAE;IAuxN5B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAiF9B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;CA4nExH"}
|