@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.
Files changed (55) hide show
  1. package/dist/core/capability-scan-workflow.d.ts +4 -9
  2. package/dist/core/capability-scan-workflow.d.ts.map +1 -1
  3. package/dist/core/capability-scan-workflow.js +203 -455
  4. package/dist/core/discovery.d.ts.map +1 -1
  5. package/dist/core/discovery.js +4 -3
  6. package/dist/core/embedding-service.d.ts +9 -36
  7. package/dist/core/embedding-service.d.ts.map +1 -1
  8. package/dist/core/embedding-service.js +137 -253
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.js +2 -2
  11. package/dist/core/kubernetes-utils.d.ts +1 -0
  12. package/dist/core/kubernetes-utils.d.ts.map +1 -1
  13. package/dist/core/kubernetes-utils.js +53 -48
  14. package/dist/core/providers/anthropic-provider.d.ts.map +1 -1
  15. package/dist/core/providers/anthropic-provider.js +352 -282
  16. package/dist/core/providers/vercel-provider.d.ts.map +1 -1
  17. package/dist/core/providers/vercel-provider.js +389 -351
  18. package/dist/core/tracing/ai-tracing.d.ts +80 -0
  19. package/dist/core/tracing/ai-tracing.d.ts.map +1 -0
  20. package/dist/core/tracing/ai-tracing.js +122 -0
  21. package/dist/core/tracing/config.d.ts +15 -0
  22. package/dist/core/tracing/config.d.ts.map +1 -0
  23. package/dist/core/tracing/config.js +133 -0
  24. package/dist/core/tracing/http-tracing.d.ts +28 -0
  25. package/dist/core/tracing/http-tracing.d.ts.map +1 -0
  26. package/dist/core/tracing/http-tracing.js +119 -0
  27. package/dist/core/tracing/index.d.ts +14 -0
  28. package/dist/core/tracing/index.d.ts.map +1 -0
  29. package/dist/core/tracing/index.js +40 -0
  30. package/dist/core/tracing/k8s-tracing.d.ts +57 -0
  31. package/dist/core/tracing/k8s-tracing.d.ts.map +1 -0
  32. package/dist/core/tracing/k8s-tracing.js +155 -0
  33. package/dist/core/tracing/qdrant-tracing.d.ts +68 -0
  34. package/dist/core/tracing/qdrant-tracing.d.ts.map +1 -0
  35. package/dist/core/tracing/qdrant-tracing.js +102 -0
  36. package/dist/core/tracing/tool-tracing.d.ts +31 -0
  37. package/dist/core/tracing/tool-tracing.d.ts.map +1 -0
  38. package/dist/core/tracing/tool-tracing.js +76 -0
  39. package/dist/core/tracing/tracer.d.ts +21 -0
  40. package/dist/core/tracing/tracer.d.ts.map +1 -0
  41. package/dist/core/tracing/tracer.js +215 -0
  42. package/dist/core/tracing/types.d.ts +86 -0
  43. package/dist/core/tracing/types.d.ts.map +1 -0
  44. package/dist/core/tracing/types.js +41 -0
  45. package/dist/core/vector-db-service.d.ts.map +1 -1
  46. package/dist/core/vector-db-service.js +238 -163
  47. package/dist/interfaces/mcp.d.ts.map +1 -1
  48. package/dist/interfaces/mcp.js +71 -43
  49. package/dist/mcp/server.js +12 -2
  50. package/dist/tools/organizational-data.d.ts.map +1 -1
  51. package/dist/tools/organizational-data.js +2 -4
  52. package/dist/tools/version.d.ts +12 -1
  53. package/dist/tools/version.d.ts.map +1 -1
  54. package/dist/tools/version.js +24 -4
  55. package/package.json +9 -1
@@ -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
- // Register with MCP server
67
- this.server.tool(name, description, inputSchema, handler);
68
- // Register with REST registry
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
- this.logger.debug('HTTP request received', {
192
- method: req.method,
193
- url: req.url,
194
- headers: req.headers
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
- await this.restApiRouter.handleRequest(req, res, body);
215
- return;
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
- this.logger.error('REST API request failed', error);
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: 'REST API internal server 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) => {
@@ -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 || '/app/sessions';
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: /app/sessions\n');
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;AAujBF;;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"}
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':
@@ -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 status including version information, Vector DB connection status, embedding service capabilities, AI provider connectivity, Kubernetes cluster connectivity, Kyverno policy engine status, and pattern management health check";
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":"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"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/tools/version.ts"],"names":[],"mappings":"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"}
@@ -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 status including version information, Vector DB connection status, embedding service capabilities, AI provider connectivity, Kubernetes cluster connectivity, Kyverno policy engine status, and pattern management health check';
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.125.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",