@vfarcic/dot-ai 0.179.0 → 0.181.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 (38) hide show
  1. package/dist/core/generic-session-manager.d.ts +5 -0
  2. package/dist/core/generic-session-manager.d.ts.map +1 -1
  3. package/dist/core/generic-session-manager.js +8 -1
  4. package/dist/core/mermaid-tools.d.ts +27 -0
  5. package/dist/core/mermaid-tools.d.ts.map +1 -0
  6. package/dist/core/mermaid-tools.js +115 -0
  7. package/dist/core/providers/vercel-provider.d.ts.map +1 -1
  8. package/dist/core/providers/vercel-provider.js +14 -13
  9. package/dist/core/visualization.d.ts +77 -0
  10. package/dist/core/visualization.d.ts.map +1 -0
  11. package/dist/core/visualization.js +80 -0
  12. package/dist/interfaces/rest-api.d.ts +19 -2
  13. package/dist/interfaces/rest-api.d.ts.map +1 -1
  14. package/dist/interfaces/rest-api.js +120 -47
  15. package/dist/tools/generate-manifests.d.ts.map +1 -1
  16. package/dist/tools/generate-manifests.js +93 -23
  17. package/dist/tools/operate-analysis.d.ts.map +1 -1
  18. package/dist/tools/operate-analysis.js +5 -0
  19. package/dist/tools/operate.d.ts +4 -1
  20. package/dist/tools/operate.d.ts.map +1 -1
  21. package/dist/tools/operate.js +9 -1
  22. package/dist/tools/organizational-data.d.ts +1 -1
  23. package/dist/tools/query.d.ts +2 -1
  24. package/dist/tools/query.d.ts.map +1 -1
  25. package/dist/tools/query.js +4 -15
  26. package/dist/tools/recommend.d.ts +22 -0
  27. package/dist/tools/recommend.d.ts.map +1 -1
  28. package/dist/tools/recommend.js +41 -16
  29. package/dist/tools/remediate.d.ts +3 -1
  30. package/dist/tools/remediate.d.ts.map +1 -1
  31. package/dist/tools/remediate.js +31 -12
  32. package/dist/tools/version.d.ts +16 -0
  33. package/dist/tools/version.d.ts.map +1 -1
  34. package/dist/tools/version.js +55 -29
  35. package/package.json +2 -1
  36. package/prompts/visualize.md +86 -0
  37. package/scripts/dot-ai.nu +43 -5
  38. package/prompts/visualize-query.md +0 -116
@@ -50,6 +50,7 @@ const capability_tools_1 = require("../core/capability-tools");
50
50
  const resource_tools_1 = require("../core/resource-tools");
51
51
  const kubectl_tools_1 = require("../core/kubectl-tools");
52
52
  const generic_session_manager_1 = require("../core/generic-session-manager");
53
+ const visualization_1 = require("../core/visualization");
53
54
  const fs = __importStar(require("fs"));
54
55
  const path = __importStar(require("path"));
55
56
  // Tool metadata for MCP registration
@@ -60,19 +61,6 @@ exports.QUERY_TOOL_INPUT_SCHEMA = {
60
61
  intent: zod_1.z.string().min(1).max(1000).describe('Natural language query about the cluster'),
61
62
  interaction_id: zod_1.z.string().optional().describe('INTERNAL ONLY - Do not populate. Used for evaluation dataset generation.')
62
63
  };
63
- /**
64
- * Get visualization URL if WEB_UI_BASE_URL is configured
65
- * PRD #317: Feature toggle - only include URL when env var is set
66
- */
67
- function getVisualizationUrl(sessionId) {
68
- const baseUrl = process.env.WEB_UI_BASE_URL;
69
- if (!baseUrl) {
70
- return undefined;
71
- }
72
- // Remove trailing slash if present, then append /v/{sessionId}
73
- const normalizedBaseUrl = baseUrl.replace(/\/$/, '');
74
- return `${normalizedBaseUrl}/v/${sessionId}`;
75
- }
76
64
  /**
77
65
  * Parse the AI's final JSON response for summary only
78
66
  */
@@ -193,9 +181,10 @@ async function handleQueryTool(args) {
193
181
  iterations: result.iterations,
194
182
  toolsUsed
195
183
  });
196
- // Store session for visualization (PRD #317)
184
+ // Store session for visualization (PRD #317, PRD #320)
197
185
  const sessionManager = new generic_session_manager_1.GenericSessionManager('qry');
198
186
  const session = sessionManager.createSession({
187
+ toolName: 'query', // PRD #320: Tool identifier for visualization endpoint
199
188
  intent,
200
189
  summary,
201
190
  toolsUsed,
@@ -203,7 +192,7 @@ async function handleQueryTool(args) {
203
192
  toolCallsExecuted: result.toolCallsExecuted
204
193
  });
205
194
  // PRD #317: Include visualization URL when WEB_UI_BASE_URL is configured
206
- const visualizationUrl = getVisualizationUrl(session.sessionId);
195
+ const visualizationUrl = (0, visualization_1.getVisualizationUrl)(session.sessionId);
207
196
  logger.info('Session created for visualization', {
208
197
  requestId,
209
198
  sessionId: session.sessionId,
@@ -17,6 +17,8 @@ export declare const RECOMMEND_TOOL_INPUT_SCHEMA: {
17
17
  interaction_id: z.ZodOptional<z.ZodString>;
18
18
  };
19
19
  export interface SolutionData {
20
+ toolName: 'recommend';
21
+ stage?: string;
20
22
  intent: string;
21
23
  type: string;
22
24
  score: number;
@@ -39,6 +41,26 @@ export interface SolutionData {
39
41
  answers: Record<string, any>;
40
42
  timestamp: string;
41
43
  appliedPatterns?: string[];
44
+ generatedManifests?: {
45
+ type: 'raw' | 'helm' | 'kustomize';
46
+ outputPath?: string;
47
+ files?: Array<{
48
+ relativePath: string;
49
+ content: string;
50
+ }>;
51
+ valuesYaml?: string;
52
+ helmCommand?: string;
53
+ chart?: {
54
+ repository: string;
55
+ repositoryName: string;
56
+ chartName: string;
57
+ version: string;
58
+ };
59
+ releaseName?: string;
60
+ namespace?: string;
61
+ validationAttempts?: number;
62
+ packagingAttempts?: number;
63
+ };
42
64
  }
43
65
  /**
44
66
  * Direct MCP tool handler for recommend functionality (unified with stage routing)
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/tools/recommend.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAUhD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,0BAA0B,yXAAyX,CAAC;AAGja,eAAO,MAAM,2BAA2B;;;;;;;;CAWvC,CAAC;AAIF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE;QACT,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACd,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAiCD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAkVxD"}
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/tools/recommend.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAWhD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,0BAA0B,yXAAyX,CAAC;AAGja,eAAO,MAAM,2BAA2B;;;;;;;;CAWvC,CAAC;AAIF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE;QACT,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACd,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,kBAAkB,CAAC,EAAE;QACnB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;QACnC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,YAAY,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE;YACN,UAAU,EAAE,MAAM,CAAC;YACnB,cAAc,EAAE,MAAM,CAAC;YACvB,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAiCD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CA+WxD"}
@@ -16,6 +16,7 @@ const generate_manifests_1 = require("./generate-manifests");
16
16
  const deploy_manifests_1 = require("./deploy-manifests");
17
17
  const shared_prompt_loader_1 = require("../core/shared-prompt-loader");
18
18
  const platform_utils_1 = require("../core/platform-utils");
19
+ const visualization_1 = require("../core/visualization");
19
20
  const artifacthub_1 = require("../core/artifacthub");
20
21
  // Intent refinement heuristic constants
21
22
  const VAGUE_INTENT_THRESHOLD = 100; // Characters - intents below this trigger guidance
@@ -202,6 +203,7 @@ async function handleRecommendTool(args, dotAI, logger, requestId) {
202
203
  // Find the original chart data from ArtifactHub results
203
204
  const originalChart = charts.find(c => c.name === aiSolution.chartName);
204
205
  const solutionData = {
206
+ toolName: 'recommend',
205
207
  intent: args.intent,
206
208
  type: 'helm',
207
209
  score: aiSolution.score,
@@ -232,6 +234,9 @@ async function handleRecommendTool(args, dotAI, logger, requestId) {
232
234
  reasons: aiSolution.reasons
233
235
  });
234
236
  }
237
+ // PRD #320: Generate visualization URL with all solution session IDs
238
+ const helmSessionIds = helmSolutionSummaries.map(s => s.solutionId);
239
+ const helmVisualizationUrl = (0, visualization_1.getVisualizationUrl)(helmSessionIds);
235
240
  // Build Helm solutions response
236
241
  const helmResponse = {
237
242
  intent: args.intent,
@@ -239,19 +244,27 @@ async function handleRecommendTool(args, dotAI, logger, requestId) {
239
244
  helmInstallation: true,
240
245
  nextAction: 'Call recommend tool with stage: chooseSolution and your preferred solutionId',
241
246
  guidance: '🔴 CRITICAL: Present these Helm chart options to the user and ask them to choose. DO NOT automatically call chooseSolution() without user input. Show the chart details (repository, version, official status) to help users decide.',
242
- timestamp
247
+ timestamp,
248
+ ...(helmVisualizationUrl && { visualizationUrl: helmVisualizationUrl })
243
249
  };
244
250
  logger.info('Helm solutions prepared', {
245
251
  requestId,
246
252
  solutionCount: helmSolutionSummaries.length,
247
- topScore: helmSolutionSummaries[0]?.score
253
+ topScore: helmSolutionSummaries[0]?.score,
254
+ ...(helmVisualizationUrl && { visualizationUrl: helmVisualizationUrl })
248
255
  });
249
- return {
250
- content: [{
251
- type: 'text',
252
- text: JSON.stringify(helmResponse, null, 2)
253
- }]
254
- };
256
+ // PRD #320: Return two content blocks - JSON for REST API, text instruction for MCP agents
257
+ const content = [{
258
+ type: 'text',
259
+ text: JSON.stringify(helmResponse, null, 2)
260
+ }];
261
+ if (helmVisualizationUrl) {
262
+ content.push({
263
+ type: 'text',
264
+ text: `📊 **View visualization**: ${helmVisualizationUrl}`
265
+ });
266
+ }
267
+ return { content };
255
268
  }
256
269
  const solutions = solutionResult.solutions;
257
270
  logger.info('Recommendation process completed', {
@@ -267,6 +280,7 @@ async function handleRecommendTool(args, dotAI, logger, requestId) {
267
280
  for (const solution of topSolutions) {
268
281
  // Create complete solution data
269
282
  const solutionData = {
283
+ toolName: 'recommend',
270
284
  intent: args.intent,
271
285
  type: solution.type,
272
286
  score: solution.score,
@@ -309,6 +323,9 @@ async function handleRecommendTool(args, dotAI, logger, requestId) {
309
323
  const patternsUsedCount = solutionSummaries.filter(s => s.appliedPatterns && s.appliedPatterns.length > 0).length;
310
324
  const totalPatterns = solutionSummaries.reduce((count, s) => count + (s.appliedPatterns?.length || 0), 0);
311
325
  const totalPolicies = solutionSummaries.reduce((count, s) => count + (s.relevantPolicies?.length || 0), 0);
326
+ // PRD #320: Generate visualization URL with all solution session IDs
327
+ const sessionIds = solutionSummaries.map(s => s.solutionId);
328
+ const visualizationUrl = (0, visualization_1.getVisualizationUrl)(sessionIds);
312
329
  // Build new response format
313
330
  const response = {
314
331
  intent: args.intent,
@@ -323,18 +340,26 @@ async function handleRecommendTool(args, dotAI, logger, requestId) {
323
340
  },
324
341
  nextAction: "Call recommend tool with stage: chooseSolution and your preferred solutionId",
325
342
  guidance: "🔴 CRITICAL: You MUST present these solutions to the user and ask them to choose. DO NOT automatically call chooseSolution() without user input. Stop here and wait for user selection. IMPORTANT: Show the list of Kubernetes resources (from the 'resources' field) that each solution will use - this helps users understand what gets deployed. ALSO: Include pattern usage information in your response - show which solutions used organizational patterns and which did not.",
326
- timestamp
343
+ timestamp,
344
+ ...(visualizationUrl && { visualizationUrl })
327
345
  };
328
346
  logger.info('Solution sessions created and response prepared', {
329
347
  requestId,
330
- solutionCount: solutionSummaries.length
348
+ solutionCount: solutionSummaries.length,
349
+ ...(visualizationUrl && { visualizationUrl })
331
350
  });
332
- return {
333
- content: [{
334
- type: 'text',
335
- text: JSON.stringify(response, null, 2)
336
- }]
337
- };
351
+ // PRD #320: Return two content blocks - JSON for REST API, text instruction for MCP agents
352
+ const content = [{
353
+ type: 'text',
354
+ text: JSON.stringify(response, null, 2)
355
+ }];
356
+ if (visualizationUrl) {
357
+ content.push({
358
+ type: 'text',
359
+ text: `📊 **View visualization**: ${visualizationUrl}`
360
+ });
361
+ }
362
+ return { content };
338
363
  }, {
339
364
  operation: 'recommend_tool',
340
365
  component: 'RecommendTool',
@@ -2,6 +2,7 @@
2
2
  * Remediate Tool - AI-powered Kubernetes issue analysis and remediation
3
3
  */
4
4
  import { z } from 'zod';
5
+ import { BaseVisualizationData } from '../core/visualization';
5
6
  export declare const REMEDIATE_TOOL_NAME = "remediate";
6
7
  export declare const REMEDIATE_TOOL_DESCRIPTION = "AI-powered Kubernetes issue analysis that provides root cause identification and actionable remediation steps. Unlike basic kubectl commands, this tool performs multi-step investigation, correlates cluster data, and generates intelligent solutions. Use when users want to understand WHY something is broken, not just see raw status. Ideal for: troubleshooting failures, diagnosing performance issues, analyzing pod problems, investigating networking/storage issues, or any \"what's wrong\" questions.";
7
8
  export declare const REMEDIATE_TOOL_INPUT_SCHEMA: {
@@ -31,7 +32,8 @@ export interface RemediateInput {
31
32
  executedCommands?: string[];
32
33
  interaction_id?: string;
33
34
  }
34
- export interface RemediateSessionData {
35
+ export interface RemediateSessionData extends BaseVisualizationData {
36
+ toolName: 'remediate';
35
37
  issue: string;
36
38
  mode: 'manual' | 'automatic';
37
39
  interaction_id?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"remediate.d.ts","sourceRoot":"","sources":["../../src/tools/remediate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remediate.d.ts","sourceRoot":"","sources":["../../src/tools/remediate.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,7 @@ const ai_provider_factory_1 = require("../core/ai-provider-factory");
45
45
  const generic_session_manager_1 = require("../core/generic-session-manager");
46
46
  const kubectl_tools_1 = require("../core/kubectl-tools");
47
47
  const index_1 = require("../core/index");
48
+ const visualization_1 = require("../core/visualization");
48
49
  const fs = __importStar(require("fs"));
49
50
  const path = __importStar(require("path"));
50
51
  // PRD #143 Milestone 1: Hybrid approach - AI can use kubectl_api_resources tool OR continue with JSON dataRequests
@@ -596,7 +597,9 @@ async function handleRemediateTool(args) {
596
597
  throw error_handling_1.ErrorHandler.createError(error_handling_1.ErrorCategory.VALIDATION, error_handling_1.ErrorSeverity.HIGH, 'Issue description is required for new investigations', { operation: 'input_validation', component: 'RemediateTool' });
597
598
  }
598
599
  // Create initial session using session manager
600
+ // PRD #320: Include toolName for visualization prompt selection
599
601
  const session = sessionManager.createSession({
602
+ toolName: 'remediate',
600
603
  issue: validatedInput.issue,
601
604
  mode: validatedInput.mode || 'manual',
602
605
  interaction_id: validatedInput.interaction_id,
@@ -622,14 +625,22 @@ async function handleRemediateTool(args) {
622
625
  sessionId: session.sessionId,
623
626
  status: finalAnalysis.status
624
627
  });
625
- // Return MCP-compliant response for resolved issues
628
+ // PRD #320: Generate visualization URL for resolved issues
629
+ const visualizationUrl = (0, visualization_1.getVisualizationUrl)(session.sessionId);
630
+ // PRD #320: Append visualization URL to message so agents display it to users
631
+ const messageWithVisualization = visualizationUrl
632
+ ? `${finalAnalysis.message}\n\n📊 View visualization: ${visualizationUrl}`
633
+ : finalAnalysis.message;
634
+ // PRD #320: Return JSON with visualization URL in message (for agents) and visualizationUrl field (for REST API)
626
635
  return {
627
- content: [
628
- {
636
+ content: [{
629
637
  type: 'text',
630
- text: JSON.stringify(finalAnalysis, null, 2)
631
- }
632
- ]
638
+ text: JSON.stringify({
639
+ ...finalAnalysis,
640
+ message: messageWithVisualization,
641
+ ...(visualizationUrl && { visualizationUrl })
642
+ }, null, 2)
643
+ }]
633
644
  };
634
645
  }
635
646
  // Make execution decision based on mode and thresholds
@@ -673,14 +684,22 @@ async function handleRemediateTool(args) {
673
684
  // Execute commands and return the complete result (includes post-execution validation)
674
685
  return await executeRemediationCommands(session, sessionManager, logger, requestId, validatedInput.interaction_id);
675
686
  }
676
- // Return MCP-compliant response
687
+ // PRD #320: Generate visualization URL for analysis response
688
+ const visualizationUrl = (0, visualization_1.getVisualizationUrl)(session.sessionId);
689
+ // PRD #320: Append visualization URL to message so agents display it to users
690
+ const messageWithVisualization = visualizationUrl
691
+ ? `${finalResult.message}\n\n📊 View visualization: ${visualizationUrl}`
692
+ : finalResult.message;
693
+ // PRD #320: Return JSON with visualization URL in message (for agents) and visualizationUrl field (for REST API)
677
694
  return {
678
- content: [
679
- {
695
+ content: [{
680
696
  type: 'text',
681
- text: JSON.stringify(finalResult, null, 2)
682
- }
683
- ]
697
+ text: JSON.stringify({
698
+ ...finalResult,
699
+ message: messageWithVisualization,
700
+ ...(visualizationUrl && { visualizationUrl })
701
+ }, null, 2)
702
+ }]
684
703
  };
685
704
  }
686
705
  catch (error) {
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { z } from 'zod';
8
8
  import { Logger } from '../core/error-handling';
9
+ import { BaseVisualizationData } from '../core/visualization';
9
10
  export declare const VERSION_TOOL_NAME = "version";
10
11
  export declare const VERSION_TOOL_DESCRIPTION = "Get comprehensive system health and diagnostics";
11
12
  export declare const VERSION_TOOL_INPUT_SCHEMA: {
@@ -91,6 +92,21 @@ export interface SystemStatus {
91
92
  initialized: boolean;
92
93
  };
93
94
  }
95
+ export interface VersionSessionData extends BaseVisualizationData {
96
+ toolName: 'version';
97
+ system: SystemStatus;
98
+ summary: {
99
+ overall: 'healthy' | 'degraded';
100
+ patternSearch: string;
101
+ capabilityScanning: string;
102
+ kubernetesAccess: string;
103
+ policyIntentManagement: string;
104
+ kyvernoPolicyGeneration: string;
105
+ capabilities: string[];
106
+ };
107
+ timestamp: string;
108
+ status: 'success' | 'error';
109
+ }
94
110
  /**
95
111
  * Test Kyverno installation and readiness for policy generation using shared client
96
112
  */
@@ -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;AAOhD,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,eAAO,MAAM,wBAAwB,oDAAoD,CAAC;AAC1F,eAAO,MAAM,yBAAyB;;CAErC,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE;QACR,SAAS,EAAE,OAAO,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,EAAE;YACX,QAAQ,EAAE;gBACR,MAAM,EAAE,OAAO,CAAC;gBAChB,cAAc,CAAC,EAAE,MAAM,CAAC;gBACxB,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,CAAC;YACF,QAAQ,EAAE;gBACR,MAAM,EAAE,OAAO,CAAC;gBAChB,cAAc,CAAC,EAAE,MAAM,CAAC;gBACxB,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,CAAC;YACF,YAAY,EAAE;gBACZ,MAAM,EAAE,OAAO,CAAC;gBAChB,cAAc,CAAC,EAAE,MAAM,CAAC;gBACxB,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,CAAC;SACH,CAAC;KACH,CAAC;IACF,SAAS,EAAE;QACT,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,EAAE;QACV,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACZ,WAAW,EAAE,OAAO,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;QACzB,oBAAoB,EAAE,OAAO,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACP,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;CACH;AA4PD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAoIzE;AAiJD;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAqB5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAAC,SAAS,CAAC,CAW1D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,CA+Fd"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/tools/version.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,8 @@ const discovery_1 = require("../core/discovery");
53
53
  const kubernetes_utils_1 = require("../core/kubernetes-utils");
54
54
  const tracing_1 = require("../core/tracing");
55
55
  const config_1 = require("../core/tracing/config");
56
+ const generic_session_manager_1 = require("../core/generic-session-manager");
57
+ const visualization_1 = require("../core/visualization");
56
58
  exports.VERSION_TOOL_NAME = 'version';
57
59
  exports.VERSION_TOOL_DESCRIPTION = 'Get comprehensive system health and diagnostics';
58
60
  exports.VERSION_TOOL_INPUT_SCHEMA = {
@@ -603,36 +605,60 @@ async function handleVersionTool(args, logger, requestId) {
603
605
  });
604
606
  // Check if we should show feedback message
605
607
  const feedbackMessage = (0, index_1.maybeGetFeedbackMessage)();
606
- return {
607
- content: [{
608
- type: 'text',
609
- text: JSON.stringify({
610
- status: 'success',
611
- system: systemStatus,
612
- summary: {
613
- overall: vectorDBStatus.connected && aiProviderStatus.connected && kubernetesStatus.connected && capabilityStatus.systemReady ? 'healthy' : 'degraded',
614
- patternSearch: embeddingStatus.available ? 'semantic+keyword' : 'keyword-only',
615
- capabilityScanning: capabilityStatus.systemReady && kubernetesStatus.connected ? 'ready' : 'not-ready',
616
- kubernetesAccess: kubernetesStatus.connected ? 'connected' : 'disconnected',
617
- policyIntentManagement: vectorDBStatus.connected && embeddingStatus.available ? 'ready' : 'not-ready',
618
- kyvernoPolicyGeneration: kyvernoStatus.policyGenerationReady ? 'ready' : 'not-ready',
619
- capabilities: [
620
- vectorDBStatus.connected && vectorDBStatus.collections.patterns.exists ? 'pattern-management' : null,
621
- // Policy intent management is available if Vector DB and embedding service are ready
622
- vectorDBStatus.connected && embeddingStatus.available ? 'policy-intent-management' : null,
623
- capabilityStatus.systemReady && kubernetesStatus.connected ? 'capability-scanning' : null,
624
- embeddingStatus.available ? 'semantic-search' : null,
625
- aiProviderStatus.connected ? 'ai-recommendations' : null,
626
- kubernetesStatus.connected ? 'kubernetes-integration' : null,
627
- // Kyverno policy generation is only available when Kyverno is installed
628
- kyvernoStatus.policyGenerationReady ? 'kyverno-policy-generation' : null
629
- ].filter(Boolean)
630
- },
631
- timestamp: new Date().toISOString(),
632
- ...(feedbackMessage ? { message: feedbackMessage } : {})
633
- }, null, 2)
634
- }]
608
+ // Build summary object
609
+ const summary = {
610
+ overall: (vectorDBStatus.connected && aiProviderStatus.connected && kubernetesStatus.connected && capabilityStatus.systemReady ? 'healthy' : 'degraded'),
611
+ patternSearch: embeddingStatus.available ? 'semantic+keyword' : 'keyword-only',
612
+ capabilityScanning: capabilityStatus.systemReady && kubernetesStatus.connected ? 'ready' : 'not-ready',
613
+ kubernetesAccess: kubernetesStatus.connected ? 'connected' : 'disconnected',
614
+ policyIntentManagement: vectorDBStatus.connected && embeddingStatus.available ? 'ready' : 'not-ready',
615
+ kyvernoPolicyGeneration: kyvernoStatus.policyGenerationReady ? 'ready' : 'not-ready',
616
+ capabilities: [
617
+ vectorDBStatus.connected && vectorDBStatus.collections.patterns.exists ? 'pattern-management' : null,
618
+ // Policy intent management is available if Vector DB and embedding service are ready
619
+ vectorDBStatus.connected && embeddingStatus.available ? 'policy-intent-management' : null,
620
+ capabilityStatus.systemReady && kubernetesStatus.connected ? 'capability-scanning' : null,
621
+ embeddingStatus.available ? 'semantic-search' : null,
622
+ aiProviderStatus.connected ? 'ai-recommendations' : null,
623
+ kubernetesStatus.connected ? 'kubernetes-integration' : null,
624
+ // Kyverno policy generation is only available when Kyverno is installed
625
+ kyvernoStatus.policyGenerationReady ? 'kyverno-policy-generation' : null
626
+ ].filter(Boolean)
627
+ };
628
+ const timestamp = new Date().toISOString();
629
+ // PRD #320: Create session for visualization
630
+ const sessionManager = new generic_session_manager_1.GenericSessionManager('ver');
631
+ const session = sessionManager.createSession({
632
+ toolName: 'version',
633
+ system: systemStatus,
634
+ summary,
635
+ timestamp,
636
+ status: 'success'
637
+ });
638
+ // PRD #320: Generate visualization URL if configured
639
+ const visualizationUrl = (0, visualization_1.getVisualizationUrl)(session.sessionId);
640
+ // PRD #320: Build response with visualization instruction for agents
641
+ const responseData = {
642
+ status: 'success',
643
+ system: systemStatus,
644
+ summary,
645
+ timestamp,
646
+ ...(feedbackMessage ? { message: feedbackMessage } : {}),
647
+ ...(visualizationUrl ? { visualizationUrl } : {})
635
648
  };
649
+ // PRD #320: Return two content blocks - JSON for REST API, text instruction for MCP agents
650
+ const content = [{
651
+ type: 'text',
652
+ text: JSON.stringify(responseData, null, 2)
653
+ }];
654
+ // Add visualization instruction as second content block so agents display it to users
655
+ if (visualizationUrl) {
656
+ content.push({
657
+ type: 'text',
658
+ text: `📊 **View visualization**: ${visualizationUrl}`
659
+ });
660
+ }
661
+ return { content };
636
662
  }
637
663
  catch (error) {
638
664
  const errorMessage = error instanceof Error ? error.message : String(error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vfarcic/dot-ai",
3
- "version": "0.179.0",
3
+ "version": "0.181.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",
@@ -114,6 +114,7 @@
114
114
  "@qdrant/js-client-rest": "^1.15.0",
115
115
  "ai": "^5.0.60",
116
116
  "handlebars": "^4.7.8",
117
+ "mermaid": "^11.12.2",
117
118
  "yaml": "^2.8.0",
118
119
  "zod-to-json-schema": "^3.24.6"
119
120
  },
@@ -0,0 +1,86 @@
1
+ # Visualization Generator
2
+
3
+ You are a Kubernetes visualization expert. Analyze the provided data and generate visualizations that reveal valuable insights.
4
+
5
+ ## User Intent
6
+
7
+ {{{intent}}}
8
+
9
+ ## Data
10
+
11
+ {{{data}}}
12
+
13
+ ## Your Task
14
+
15
+ **Start with the provided data**: Analyze this data thoroughly first to create visualizations that surface everything valuable.
16
+
17
+ If the provided data isn't sufficient for deep analysis, **actively use tools** to gather additional information. Don't just note uncertainties - investigate them.
18
+
19
+ ## Output Format
20
+
21
+ Respond with ONLY a JSON object (no markdown code fences, no extra text):
22
+
23
+ {
24
+ "title": "Descriptive title based on what was found",
25
+ "visualizations": [...],
26
+ "insights": [...]
27
+ }
28
+
29
+ ## Visualization Types
30
+
31
+ Generate as many or as few visualizations as add value. You can:
32
+ - Include multiple visualizations of the same type
33
+ - Skip any type entirely if it doesn't add value for this data
34
+ - Use whatever combination best represents what you found
35
+
36
+ Each visualization:
37
+ ```
38
+ {
39
+ "id": "unique-id",
40
+ "label": "Tab Label",
41
+ "type": "mermaid" | "table" | "cards" | "code",
42
+ "content": <type-specific-content>
43
+ }
44
+ ```
45
+
46
+ ### mermaid
47
+ - `content`: Valid Mermaid diagram string
48
+ - Use `graph TD` or `graph LR` depending on relationship type
49
+ - Use subgraphs to group related items
50
+ - Arrows: `-->` for direct relationships, `-.->` for indirect/inferred
51
+ - **Syntax rules**:
52
+ - Node names in `class` statements MUST be comma-separated: `class a,b,c style` (not space-separated)
53
+ - If using `classDef`, ALWAYS specify both `fill` AND `color` (text) with sufficient contrast
54
+ - Truncate UUIDs to first 8 characters (e.g., `pvc-508555a4...`)
55
+ - Keep node labels under 30 characters when possible
56
+
57
+ ### table
58
+ - `content`: `{ "headers": ["Col1", "Col2"], "rows": [["val1", "val2"]] }`
59
+ - Choose columns relevant to the data present
60
+ - Include status/condition information when available
61
+
62
+ ### cards
63
+ - `content`: `[{ "id": "unique", "title": "Name", "subtitle": "Type or status", "description": "Details", "tags": ["tag1"] }]`
64
+ - Use for items where individual status or comparison matters
65
+ - Tags should reflect actual state from the data
66
+
67
+ ### code
68
+ - `content`: `{ "language": "yaml" | "json" | "bash", "code": "..." }`
69
+ - Use sparingly - only when raw output adds value
70
+
71
+ ## Insights
72
+
73
+ Generate insights that add value beyond what someone could see by just reading the raw data. Prioritize non-obvious findings over summaries.
74
+
75
+ Each insight should:
76
+ - Reference specific items from the data
77
+ - Explain WHY it matters, not just WHAT you found
78
+ - Be actionable when highlighting issues
79
+
80
+ ## Rules
81
+
82
+ 1. **Data-driven only** - Base visualizations on actual data present
83
+ 2. **Skip empty visualizations** - Don't include visualizations with no meaningful content
84
+ 3. **Valid output** - Ensure Mermaid syntax is correct and JSON is valid
85
+ 4. **JSON only** - No markdown fences, no explanations outside the JSON structure
86
+ 5. **Use validate_mermaid** - Before returning any Mermaid diagrams, validate them using the validate_mermaid tool