@vfarcic/dot-ai 0.125.0 → 0.126.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/dist/core/capability-scan-workflow.d.ts +4 -9
- package/dist/core/capability-scan-workflow.d.ts.map +1 -1
- package/dist/core/capability-scan-workflow.js +203 -455
- package/dist/core/discovery.d.ts.map +1 -1
- package/dist/core/discovery.js +4 -3
- package/dist/core/embedding-service.d.ts +9 -36
- package/dist/core/embedding-service.d.ts.map +1 -1
- package/dist/core/embedding-service.js +137 -253
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/kubernetes-utils.d.ts +1 -0
- package/dist/core/kubernetes-utils.d.ts.map +1 -1
- package/dist/core/kubernetes-utils.js +53 -48
- package/dist/core/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/core/providers/anthropic-provider.js +352 -282
- package/dist/core/providers/vercel-provider.d.ts.map +1 -1
- package/dist/core/providers/vercel-provider.js +389 -351
- package/dist/core/tracing/ai-tracing.d.ts +80 -0
- package/dist/core/tracing/ai-tracing.d.ts.map +1 -0
- package/dist/core/tracing/ai-tracing.js +122 -0
- package/dist/core/tracing/config.d.ts +15 -0
- package/dist/core/tracing/config.d.ts.map +1 -0
- package/dist/core/tracing/config.js +133 -0
- package/dist/core/tracing/http-tracing.d.ts +28 -0
- package/dist/core/tracing/http-tracing.d.ts.map +1 -0
- package/dist/core/tracing/http-tracing.js +119 -0
- package/dist/core/tracing/index.d.ts +14 -0
- package/dist/core/tracing/index.d.ts.map +1 -0
- package/dist/core/tracing/index.js +40 -0
- package/dist/core/tracing/k8s-tracing.d.ts +57 -0
- package/dist/core/tracing/k8s-tracing.d.ts.map +1 -0
- package/dist/core/tracing/k8s-tracing.js +155 -0
- package/dist/core/tracing/qdrant-tracing.d.ts +68 -0
- package/dist/core/tracing/qdrant-tracing.d.ts.map +1 -0
- package/dist/core/tracing/qdrant-tracing.js +102 -0
- package/dist/core/tracing/tool-tracing.d.ts +31 -0
- package/dist/core/tracing/tool-tracing.d.ts.map +1 -0
- package/dist/core/tracing/tool-tracing.js +76 -0
- package/dist/core/tracing/tracer.d.ts +21 -0
- package/dist/core/tracing/tracer.d.ts.map +1 -0
- package/dist/core/tracing/tracer.js +215 -0
- package/dist/core/tracing/types.d.ts +86 -0
- package/dist/core/tracing/types.d.ts.map +1 -0
- package/dist/core/tracing/types.js +41 -0
- package/dist/core/vector-db-service.d.ts.map +1 -1
- package/dist/core/vector-db-service.js +238 -163
- package/dist/interfaces/mcp.d.ts.map +1 -1
- package/dist/interfaces/mcp.js +71 -43
- package/dist/mcp/server.js +12 -2
- package/dist/tools/organizational-data.d.ts.map +1 -1
- package/dist/tools/organizational-data.js +2 -4
- package/dist/tools/version.d.ts +12 -1
- package/dist/tools/version.d.ts.map +1 -1
- package/dist/tools/version.js +24 -4
- package/package.json +9 -1
package/dist/interfaces/mcp.js
CHANGED
|
@@ -22,6 +22,8 @@ const project_setup_1 = require("../tools/project-setup");
|
|
|
22
22
|
const prompts_1 = require("../tools/prompts");
|
|
23
23
|
const rest_registry_1 = require("./rest-registry");
|
|
24
24
|
const rest_api_1 = require("./rest-api");
|
|
25
|
+
const tracing_1 = require("../core/tracing");
|
|
26
|
+
const api_1 = require("@opentelemetry/api");
|
|
25
27
|
class MCPServer {
|
|
26
28
|
server;
|
|
27
29
|
dotAI;
|
|
@@ -63,14 +65,18 @@ class MCPServer {
|
|
|
63
65
|
* Helper method to register a tool with both MCP server and REST registry
|
|
64
66
|
*/
|
|
65
67
|
registerTool(name, description, inputSchema, handler, category, tags) {
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
// Wrap handler with tracing for both STDIO (MCP) and HTTP (REST) transports
|
|
69
|
+
const tracedHandler = async (args) => {
|
|
70
|
+
return await (0, tracing_1.withToolTracing)(name, args, handler);
|
|
71
|
+
};
|
|
72
|
+
// Register traced handler with MCP server
|
|
73
|
+
this.server.tool(name, description, inputSchema, tracedHandler);
|
|
74
|
+
// Register traced handler with REST registry
|
|
69
75
|
this.restRegistry.registerTool({
|
|
70
76
|
name,
|
|
71
77
|
description,
|
|
72
78
|
inputSchema,
|
|
73
|
-
handler,
|
|
79
|
+
handler: tracedHandler,
|
|
74
80
|
category,
|
|
75
81
|
tags
|
|
76
82
|
});
|
|
@@ -188,52 +194,74 @@ class MCPServer {
|
|
|
188
194
|
await this.server.connect(this.httpTransport);
|
|
189
195
|
// Create HTTP server
|
|
190
196
|
this.httpServer = (0, node_http_1.createServer)(async (req, res) => {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
});
|
|
196
|
-
// Handle CORS for browser-based clients
|
|
197
|
-
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
198
|
-
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
199
|
-
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-Session-Id');
|
|
200
|
-
if (req.method === 'OPTIONS') {
|
|
201
|
-
res.writeHead(204);
|
|
202
|
-
res.end();
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
// Parse request body for POST requests
|
|
206
|
-
let body = undefined;
|
|
207
|
-
if (req.method === 'POST') {
|
|
208
|
-
body = await this.parseRequestBody(req);
|
|
209
|
-
}
|
|
210
|
-
// Check if this is a REST API request
|
|
211
|
-
if (this.restApiRouter.isApiRequest(req.url || '')) {
|
|
212
|
-
this.logger.debug('Routing to REST API handler', { url: req.url });
|
|
197
|
+
// Create HTTP SERVER span for distributed tracing
|
|
198
|
+
const { span, endSpan } = (0, tracing_1.createHttpServerSpan)(req);
|
|
199
|
+
// Execute entire request within the span's context for proper propagation
|
|
200
|
+
await api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), async () => {
|
|
213
201
|
try {
|
|
214
|
-
|
|
215
|
-
|
|
202
|
+
this.logger.debug('HTTP request received', {
|
|
203
|
+
method: req.method,
|
|
204
|
+
url: req.url,
|
|
205
|
+
headers: req.headers
|
|
206
|
+
});
|
|
207
|
+
// Handle CORS for browser-based clients
|
|
208
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
209
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
210
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-Session-Id');
|
|
211
|
+
if (req.method === 'OPTIONS') {
|
|
212
|
+
res.writeHead(204);
|
|
213
|
+
res.end();
|
|
214
|
+
endSpan(204);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// Parse request body for POST requests
|
|
218
|
+
let body = undefined;
|
|
219
|
+
if (req.method === 'POST') {
|
|
220
|
+
body = await this.parseRequestBody(req);
|
|
221
|
+
}
|
|
222
|
+
// Check if this is a REST API request
|
|
223
|
+
if (this.restApiRouter.isApiRequest(req.url || '')) {
|
|
224
|
+
this.logger.debug('Routing to REST API handler', { url: req.url });
|
|
225
|
+
try {
|
|
226
|
+
await this.restApiRouter.handleRequest(req, res, body);
|
|
227
|
+
endSpan(res.statusCode || 200);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
this.logger.error('REST API request failed', error);
|
|
232
|
+
if (!res.headersSent) {
|
|
233
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
234
|
+
res.end(JSON.stringify({ error: 'REST API internal server error' }));
|
|
235
|
+
}
|
|
236
|
+
endSpan(500);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Handle MCP protocol requests using the transport
|
|
241
|
+
try {
|
|
242
|
+
await this.httpTransport.handleRequest(req, res, body);
|
|
243
|
+
endSpan(res.statusCode || 200);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
this.logger.error('Error handling MCP HTTP request', error);
|
|
247
|
+
if (!res.headersSent) {
|
|
248
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
249
|
+
res.end(JSON.stringify({ error: 'MCP internal server error' }));
|
|
250
|
+
}
|
|
251
|
+
endSpan(500);
|
|
252
|
+
}
|
|
216
253
|
}
|
|
217
254
|
catch (error) {
|
|
218
|
-
|
|
255
|
+
// Handle any unexpected errors in span creation or request handling
|
|
256
|
+
this.logger.error('Unexpected error in HTTP request handler', error);
|
|
257
|
+
span.recordException(error);
|
|
258
|
+
endSpan(500);
|
|
219
259
|
if (!res.headersSent) {
|
|
220
260
|
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
221
|
-
res.end(JSON.stringify({ error: '
|
|
261
|
+
res.end(JSON.stringify({ error: 'Internal server error' }));
|
|
222
262
|
}
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
// Handle MCP protocol requests using the transport
|
|
227
|
-
try {
|
|
228
|
-
await this.httpTransport.handleRequest(req, res, body);
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
this.logger.error('Error handling MCP HTTP request', error);
|
|
232
|
-
if (!res.headersSent) {
|
|
233
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
234
|
-
res.end(JSON.stringify({ error: 'MCP internal server error' }));
|
|
235
263
|
}
|
|
236
|
-
}
|
|
264
|
+
}); // Close context.with()
|
|
237
265
|
});
|
|
238
266
|
// Start listening
|
|
239
267
|
await new Promise((resolve, reject) => {
|
package/dist/mcp/server.js
CHANGED
|
@@ -45,17 +45,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
const mcp_js_1 = require("../interfaces/mcp.js");
|
|
47
47
|
const index_js_1 = require("../core/index.js");
|
|
48
|
+
const index_js_2 = require("../core/tracing/index.js");
|
|
48
49
|
const fs_1 = require("fs");
|
|
49
50
|
const path_1 = __importDefault(require("path"));
|
|
50
51
|
async function main() {
|
|
51
52
|
try {
|
|
53
|
+
// Initialize OpenTelemetry tracing (must happen before HTTP server starts)
|
|
54
|
+
const tracer = (0, index_js_2.getTracer)();
|
|
55
|
+
if (tracer.isEnabled()) {
|
|
56
|
+
process.stderr.write('OpenTelemetry tracing enabled\n');
|
|
57
|
+
// Force initialization now to enable auto-instrumentation
|
|
58
|
+
tracer.initialize();
|
|
59
|
+
}
|
|
52
60
|
// Validate required environment variables
|
|
53
61
|
process.stderr.write('Validating MCP server configuration...\n');
|
|
54
62
|
// Check session directory configuration
|
|
55
|
-
const sessionDir = process.env.DOT_AI_SESSION_DIR || '/
|
|
63
|
+
const sessionDir = process.env.DOT_AI_SESSION_DIR || './tmp/sessions';
|
|
56
64
|
process.stderr.write(`Using session directory: ${sessionDir}\n`);
|
|
57
65
|
if (!process.env.DOT_AI_SESSION_DIR) {
|
|
58
|
-
process.stderr.write('INFO: DOT_AI_SESSION_DIR not set, using default: /
|
|
66
|
+
process.stderr.write('INFO: DOT_AI_SESSION_DIR not set, using default: ./tmp/sessions\n');
|
|
59
67
|
process.stderr.write('For custom session directory, set DOT_AI_SESSION_DIR environment variable\n');
|
|
60
68
|
}
|
|
61
69
|
// Validate session directory exists and is writable
|
|
@@ -123,11 +131,13 @@ async function main() {
|
|
|
123
131
|
process.on('SIGINT', async () => {
|
|
124
132
|
process.stderr.write('Shutting down DevOps AI Toolkit MCP server...\n');
|
|
125
133
|
await mcpServer.stop();
|
|
134
|
+
await (0, index_js_2.shutdownTracer)();
|
|
126
135
|
process.exit(0);
|
|
127
136
|
});
|
|
128
137
|
process.on('SIGTERM', async () => {
|
|
129
138
|
process.stderr.write('Shutting down DevOps AI Toolkit MCP server...\n');
|
|
130
139
|
await mcpServer.stop();
|
|
140
|
+
await (0, index_js_2.shutdownTracer)();
|
|
131
141
|
process.exit(0);
|
|
132
142
|
});
|
|
133
143
|
// Keep the process alive for HTTP transport
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizational-data.d.ts","sourceRoot":"","sources":["../../src/tools/organizational-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAehD,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D,eAAO,MAAM,oCAAoC,+jBAAyjB,CAAC;AAG3mB,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;CA4BjD,CAAC;
|
|
1
|
+
{"version":3,"file":"organizational-data.d.ts","sourceRoot":"","sources":["../../src/tools/organizational-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAehD,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D,eAAO,MAAM,oCAAoC,+jBAAyjB,CAAC;AAG3mB,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;CA4BjD,CAAC;AAklBF;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,KAAK,GAAG,IAAI,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,CA0Hd"}
|
|
@@ -506,11 +506,9 @@ async function handleCapabilityScan(args, logger, requestId) {
|
|
|
506
506
|
// Handle workflow based on current step
|
|
507
507
|
switch (session.currentStep) {
|
|
508
508
|
case 'resource-selection':
|
|
509
|
-
return await (0, capability_scan_workflow_1.handleResourceSelection)(session, args, logger, requestId, parseNumericResponse, transitionCapabilitySession);
|
|
509
|
+
return await (0, capability_scan_workflow_1.handleResourceSelection)(session, args, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse, capability_scan_workflow_1.handleScanning);
|
|
510
510
|
case 'resource-specification':
|
|
511
|
-
return await (0, capability_scan_workflow_1.handleResourceSpecification)(session, args, logger, requestId, transitionCapabilitySession);
|
|
512
|
-
case 'processing-mode':
|
|
513
|
-
return await (0, capability_scan_workflow_1.handleProcessingMode)(session, args, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse, (session, args, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse) => (0, capability_scan_workflow_1.handleScanning)(session, args, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse));
|
|
511
|
+
return await (0, capability_scan_workflow_1.handleResourceSpecification)(session, args, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse, capability_scan_workflow_1.handleScanning);
|
|
514
512
|
case 'scanning':
|
|
515
513
|
return await (0, capability_scan_workflow_1.handleScanning)(session, args, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse);
|
|
516
514
|
case 'complete':
|
package/dist/tools/version.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { Logger } from '../core/error-handling';
|
|
9
9
|
export declare const VERSION_TOOL_NAME = "version";
|
|
10
|
-
export declare const VERSION_TOOL_DESCRIPTION = "Get comprehensive system
|
|
10
|
+
export declare const VERSION_TOOL_DESCRIPTION = "Get comprehensive system health and diagnostics";
|
|
11
11
|
export declare const VERSION_TOOL_INPUT_SCHEMA: {
|
|
12
12
|
interaction_id: z.ZodOptional<z.ZodString>;
|
|
13
13
|
};
|
|
@@ -83,6 +83,13 @@ export interface SystemStatus {
|
|
|
83
83
|
error?: string;
|
|
84
84
|
reason?: string;
|
|
85
85
|
};
|
|
86
|
+
tracing: {
|
|
87
|
+
enabled: boolean;
|
|
88
|
+
exporterType: string;
|
|
89
|
+
endpoint?: string;
|
|
90
|
+
serviceName: string;
|
|
91
|
+
initialized: boolean;
|
|
92
|
+
};
|
|
86
93
|
}
|
|
87
94
|
/**
|
|
88
95
|
* Test Kyverno installation and readiness for policy generation using shared client
|
|
@@ -92,6 +99,10 @@ export declare function getKyvernoStatus(): Promise<SystemStatus['kyverno']>;
|
|
|
92
99
|
* Get version information from package.json
|
|
93
100
|
*/
|
|
94
101
|
export declare function getVersionInfo(): VersionInfo;
|
|
102
|
+
/**
|
|
103
|
+
* Get OpenTelemetry tracing status
|
|
104
|
+
*/
|
|
105
|
+
export declare function getTracingStatus(): SystemStatus['tracing'];
|
|
95
106
|
/**
|
|
96
107
|
* Handle version tool request with comprehensive system diagnostics
|
|
97
108
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/tools/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/tools/version.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/version.js
CHANGED
|
@@ -42,6 +42,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
42
42
|
exports.VERSION_TOOL_INPUT_SCHEMA = exports.VERSION_TOOL_DESCRIPTION = exports.VERSION_TOOL_NAME = void 0;
|
|
43
43
|
exports.getKyvernoStatus = getKyvernoStatus;
|
|
44
44
|
exports.getVersionInfo = getVersionInfo;
|
|
45
|
+
exports.getTracingStatus = getTracingStatus;
|
|
45
46
|
exports.handleVersionTool = handleVersionTool;
|
|
46
47
|
const fs_1 = require("fs");
|
|
47
48
|
const path_1 = require("path");
|
|
@@ -50,8 +51,10 @@ const k8s = __importStar(require("@kubernetes/client-node"));
|
|
|
50
51
|
const index_1 = require("../core/index");
|
|
51
52
|
const discovery_1 = require("../core/discovery");
|
|
52
53
|
const kubernetes_utils_1 = require("../core/kubernetes-utils");
|
|
54
|
+
const tracing_1 = require("../core/tracing");
|
|
55
|
+
const config_1 = require("../core/tracing/config");
|
|
53
56
|
exports.VERSION_TOOL_NAME = 'version';
|
|
54
|
-
exports.VERSION_TOOL_DESCRIPTION = 'Get comprehensive system
|
|
57
|
+
exports.VERSION_TOOL_DESCRIPTION = 'Get comprehensive system health and diagnostics';
|
|
55
58
|
exports.VERSION_TOOL_INPUT_SCHEMA = {
|
|
56
59
|
interaction_id: zod_1.z.string().optional().describe('INTERNAL ONLY - Do not populate. Used for evaluation dataset generation.')
|
|
57
60
|
};
|
|
@@ -284,7 +287,7 @@ async function getKyvernoStatus() {
|
|
|
284
287
|
try {
|
|
285
288
|
// Get client and check deployment status
|
|
286
289
|
const client = discovery.getClient();
|
|
287
|
-
const appsV1Api = client.makeApiClient(k8s.AppsV1Api);
|
|
290
|
+
const appsV1Api = (0, tracing_1.createTracedK8sClient)(client.makeApiClient(k8s.AppsV1Api), 'AppsV1Api');
|
|
288
291
|
const deploymentResponse = await appsV1Api.listNamespacedDeployment({
|
|
289
292
|
namespace: 'kyverno'
|
|
290
293
|
});
|
|
@@ -314,7 +317,7 @@ async function getKyvernoStatus() {
|
|
|
314
317
|
// Check admission controller webhook
|
|
315
318
|
try {
|
|
316
319
|
const client = discovery.getClient();
|
|
317
|
-
const admissionApi = client.makeApiClient(k8s.AdmissionregistrationV1Api);
|
|
320
|
+
const admissionApi = (0, tracing_1.createTracedK8sClient)(client.makeApiClient(k8s.AdmissionregistrationV1Api), 'AdmissionregistrationV1Api');
|
|
318
321
|
const webhookResponse = await admissionApi.listValidatingWebhookConfiguration();
|
|
319
322
|
webhookReady = webhookResponse.items.some((webhook) => webhook.metadata?.name?.includes('kyverno'));
|
|
320
323
|
}
|
|
@@ -475,6 +478,20 @@ function getVersionInfo() {
|
|
|
475
478
|
arch: process.arch
|
|
476
479
|
};
|
|
477
480
|
}
|
|
481
|
+
/**
|
|
482
|
+
* Get OpenTelemetry tracing status
|
|
483
|
+
*/
|
|
484
|
+
function getTracingStatus() {
|
|
485
|
+
const config = (0, config_1.loadTracingConfig)();
|
|
486
|
+
const tracer = (0, tracing_1.getTracer)();
|
|
487
|
+
return {
|
|
488
|
+
enabled: config.enabled,
|
|
489
|
+
exporterType: config.exporterType,
|
|
490
|
+
endpoint: config.otlpEndpoint,
|
|
491
|
+
serviceName: config.serviceName,
|
|
492
|
+
initialized: tracer.isEnabled()
|
|
493
|
+
};
|
|
494
|
+
}
|
|
478
495
|
/**
|
|
479
496
|
* Handle version tool request with comprehensive system diagnostics
|
|
480
497
|
*/
|
|
@@ -495,6 +512,8 @@ async function handleVersionTool(args, logger, requestId) {
|
|
|
495
512
|
getCapabilityStatus(),
|
|
496
513
|
getKyvernoStatus()
|
|
497
514
|
]);
|
|
515
|
+
// Get tracing status synchronously (no async operations)
|
|
516
|
+
const tracingStatus = getTracingStatus();
|
|
498
517
|
const systemStatus = {
|
|
499
518
|
version,
|
|
500
519
|
vectorDB: vectorDBStatus,
|
|
@@ -502,7 +521,8 @@ async function handleVersionTool(args, logger, requestId) {
|
|
|
502
521
|
aiProvider: aiProviderStatus,
|
|
503
522
|
kubernetes: kubernetesStatus,
|
|
504
523
|
capabilities: capabilityStatus,
|
|
505
|
-
kyverno: kyvernoStatus
|
|
524
|
+
kyverno: kyvernoStatus,
|
|
525
|
+
tracing: tracingStatus
|
|
506
526
|
};
|
|
507
527
|
// Log summary of system health
|
|
508
528
|
logger.info('System diagnostics completed', {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vfarcic/dot-ai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.126.0",
|
|
4
4
|
"description": "AI-powered development productivity platform that enhances software development workflows through intelligent automation and AI-driven assistance",
|
|
5
5
|
"mcpName": "io.github.vfarcic/dot-ai",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -106,6 +106,14 @@
|
|
|
106
106
|
"@kubernetes/client-node": "^1.3.0",
|
|
107
107
|
"@modelcontextprotocol/sdk": "^1.13.2",
|
|
108
108
|
"@openrouter/ai-sdk-provider": "^1.2.0",
|
|
109
|
+
"@opentelemetry/api": "^1.9.0",
|
|
110
|
+
"@opentelemetry/auto-instrumentations-node": "^0.66.0",
|
|
111
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.207.0",
|
|
112
|
+
"@opentelemetry/resources": "^2.2.0",
|
|
113
|
+
"@opentelemetry/sdk-node": "^0.207.0",
|
|
114
|
+
"@opentelemetry/sdk-trace-base": "^2.2.0",
|
|
115
|
+
"@opentelemetry/sdk-trace-node": "^2.2.0",
|
|
116
|
+
"@opentelemetry/semantic-conventions": "^1.37.0",
|
|
109
117
|
"@qdrant/js-client-rest": "^1.15.0",
|
|
110
118
|
"ai": "^5.0.60",
|
|
111
119
|
"glob": "^11.0.3",
|