@vfarcic/dot-ai 0.150.0 → 0.152.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 (56) hide show
  1. package/README.md +1 -1
  2. package/dist/core/ai-provider-factory.d.ts +0 -9
  3. package/dist/core/ai-provider-factory.d.ts.map +1 -1
  4. package/dist/core/ai-provider-factory.js +2 -34
  5. package/dist/core/ai-provider.interface.d.ts +2 -14
  6. package/dist/core/ai-provider.interface.d.ts.map +1 -1
  7. package/dist/core/artifacthub.d.ts +85 -0
  8. package/dist/core/artifacthub.d.ts.map +1 -0
  9. package/dist/core/artifacthub.js +106 -0
  10. package/dist/core/embedding-service.js +1 -1
  11. package/dist/core/helm-types.d.ts +39 -0
  12. package/dist/core/helm-types.d.ts.map +1 -0
  13. package/dist/core/helm-types.js +5 -0
  14. package/dist/core/helm-utils.d.ts +66 -0
  15. package/dist/core/helm-utils.d.ts.map +1 -0
  16. package/dist/core/helm-utils.js +196 -0
  17. package/dist/core/index.d.ts +7 -1
  18. package/dist/core/index.d.ts.map +1 -1
  19. package/dist/core/index.js +12 -0
  20. package/dist/core/providers/noop-provider.d.ts +0 -4
  21. package/dist/core/providers/noop-provider.d.ts.map +1 -1
  22. package/dist/core/providers/noop-provider.js +0 -6
  23. package/dist/core/providers/vercel-provider.d.ts +0 -1
  24. package/dist/core/providers/vercel-provider.d.ts.map +1 -1
  25. package/dist/core/providers/vercel-provider.js +1 -4
  26. package/dist/core/schema.d.ts +32 -4
  27. package/dist/core/schema.d.ts.map +1 -1
  28. package/dist/core/schema.js +200 -18
  29. package/dist/core/solution-cr.d.ts.map +1 -1
  30. package/dist/core/solution-cr.js +2 -3
  31. package/dist/tools/answer-question.d.ts +1 -1
  32. package/dist/tools/answer-question.d.ts.map +1 -1
  33. package/dist/tools/answer-question.js +85 -16
  34. package/dist/tools/choose-solution.d.ts.map +1 -1
  35. package/dist/tools/choose-solution.js +36 -24
  36. package/dist/tools/deploy-manifests.d.ts +2 -1
  37. package/dist/tools/deploy-manifests.d.ts.map +1 -1
  38. package/dist/tools/deploy-manifests.js +86 -2
  39. package/dist/tools/generate-manifests.d.ts +1 -0
  40. package/dist/tools/generate-manifests.d.ts.map +1 -1
  41. package/dist/tools/generate-manifests.js +204 -1
  42. package/dist/tools/recommend.d.ts +3 -2
  43. package/dist/tools/recommend.d.ts.map +1 -1
  44. package/dist/tools/recommend.js +116 -3
  45. package/package.json +11 -12
  46. package/prompts/helm-chart-selection.md +65 -0
  47. package/prompts/helm-generation.md +85 -0
  48. package/prompts/intent-analysis.md +17 -0
  49. package/prompts/question-generation.md +34 -24
  50. package/prompts/resource-selection.md +52 -8
  51. package/shared-prompts/prd-start.md +20 -10
  52. package/shared-prompts/prd-update-progress.md +18 -8
  53. package/dist/core/providers/anthropic-provider.d.ts +0 -51
  54. package/dist/core/providers/anthropic-provider.d.ts.map +0 -1
  55. package/dist/core/providers/anthropic-provider.js +0 -468
  56. /package/prompts/{manifest-generation.md → capabilities-generation.md} +0 -0
package/README.md CHANGED
@@ -57,7 +57,7 @@ DevOps AI Toolkit democratizes platform engineering and cloud native operations
57
57
  ## Key Features
58
58
 
59
59
  ### 🔍 Resource Provisioning Intelligence
60
- Automatically discovers cluster resources using semantic capability management. AI understands what each resource actually does, providing intelligent recommendations for provisioning resources across clouds using Kubernetes as a control plane.
60
+ Automatically discovers cluster resources using semantic capability management. AI understands what each resource actually does, providing intelligent recommendations for provisioning resources across clouds using Kubernetes as a control plane. When no matching capability exists, automatically discovers and installs third-party tools (Prometheus, Argo CD, Crossplane, etc.) via Helm charts from ArtifactHub.
61
61
  📖 [Deployment Guide](./docs/mcp-recommendation-guide.md) | [Capability Management](./docs/mcp-capability-management-guide.md)
62
62
 
63
63
  ### 🛠️ Issue Remediation
@@ -41,18 +41,9 @@ export declare class AIProviderFactory {
41
41
  * If no API keys are configured, returns a NoOpAIProvider that allows
42
42
  * the MCP server to start but returns helpful errors when AI is needed.
43
43
  *
44
- * Supports AI_PROVIDER_SDK env var to override SDK choice:
45
- * - 'native' (default): Use native provider SDK
46
- * - 'vercel': Use Vercel AI SDK for the provider
47
- *
48
44
  * @returns Configured AI provider instance or NoOpProvider if no keys available
49
45
  */
50
46
  static createFromEnv(): AIProvider;
51
- /**
52
- * Create Anthropic provider instance
53
- * @private
54
- */
55
- private static createAnthropicProvider;
56
47
  /**
57
48
  * Check if a provider is available (has API key configured)
58
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provider-factory.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,EACV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AA4BjC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IAiCnD;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IA0FlC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMrD;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAMxC;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
1
+ {"version":3,"file":"ai-provider-factory.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,EACV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AA2BjC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IAuBnD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IA8ElC;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMrD;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAMxC;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
@@ -11,7 +11,6 @@
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AIProviderFactory = void 0;
13
13
  exports.createAIProvider = createAIProvider;
14
- const anthropic_provider_1 = require("./providers/anthropic-provider");
15
14
  const vercel_provider_1 = require("./providers/vercel-provider");
16
15
  const noop_provider_1 = require("./providers/noop-provider");
17
16
  const model_config_1 = require("./model-config");
@@ -67,17 +66,8 @@ class AIProviderFactory {
67
66
  `Phase 1 providers: ${IMPLEMENTED_PROVIDERS.join(', ')}. ` +
68
67
  `Future phases will add support for additional Vercel AI SDK providers.`);
69
68
  }
70
- // Create provider based on type
71
- switch (config.provider) {
72
- case 'anthropic':
73
- case 'anthropic_opus':
74
- case 'anthropic_haiku':
75
- return this.createAnthropicProvider(config);
76
- default:
77
- // All non-Anthropic providers use VercelProvider
78
- // This matches the integration test behavior with AI_PROVIDER_SDK=vercel
79
- return new vercel_provider_1.VercelProvider(config);
80
- }
69
+ // All providers use VercelProvider (PRD #238: consolidated on Vercel AI SDK)
70
+ return new vercel_provider_1.VercelProvider(config);
81
71
  }
82
72
  /**
83
73
  * Create provider from environment variables
@@ -88,15 +78,10 @@ class AIProviderFactory {
88
78
  * If no API keys are configured, returns a NoOpAIProvider that allows
89
79
  * the MCP server to start but returns helpful errors when AI is needed.
90
80
  *
91
- * Supports AI_PROVIDER_SDK env var to override SDK choice:
92
- * - 'native' (default): Use native provider SDK
93
- * - 'vercel': Use Vercel AI SDK for the provider
94
- *
95
81
  * @returns Configured AI provider instance or NoOpProvider if no keys available
96
82
  */
97
83
  static createFromEnv() {
98
84
  const providerType = process.env.AI_PROVIDER || 'anthropic';
99
- const sdkPreference = process.env.AI_PROVIDER_SDK || 'native';
100
85
  // Validate provider is implemented
101
86
  if (!IMPLEMENTED_PROVIDERS.includes(providerType)) {
102
87
  // Write to stderr for logging
@@ -150,16 +135,6 @@ class AIProviderFactory {
150
135
  // Generic custom endpoint (Ollama, vLLM, LiteLLM, etc.)
151
136
  effectiveProviderType = 'custom';
152
137
  }
153
- // If SDK override to 'vercel', use VercelProvider for all providers
154
- if (sdkPreference === 'vercel') {
155
- return new vercel_provider_1.VercelProvider({
156
- provider: effectiveProviderType,
157
- apiKey,
158
- model,
159
- debugMode,
160
- baseURL
161
- });
162
- }
163
138
  return this.create({
164
139
  provider: effectiveProviderType,
165
140
  apiKey,
@@ -168,13 +143,6 @@ class AIProviderFactory {
168
143
  baseURL
169
144
  });
170
145
  }
171
- /**
172
- * Create Anthropic provider instance
173
- * @private
174
- */
175
- static createAnthropicProvider(config) {
176
- return new anthropic_provider_1.AnthropicProvider(config);
177
- }
178
146
  /**
179
147
  * Check if a provider is available (has API key configured)
180
148
  *
@@ -220,23 +220,11 @@ export interface AIProvider {
220
220
  */
221
221
  getModelName(): string;
222
222
  /**
223
- * Get the underlying SDK provider being used (for Vercel AI SDK)
224
- *
225
- * @returns SDK provider name (e.g., 'xai', 'anthropic', 'openai') or the provider type for native SDKs
226
- */
227
- getSDKProvider(): string;
228
- /**
229
- * Execute agentic loop with tool calling (NEW - PRD #136)
223
+ * Execute agentic loop with tool calling (PRD #136)
230
224
  *
231
225
  * AI autonomously decides which tools to call and when to stop.
232
226
  * Supports multi-turn conversations with tool execution.
233
- *
234
- * NOTE: Currently NOT USED in codebase. PRD #136 analysis showed JSON-based loops
235
- * achieve same goals without SDK overhead. Kept for potential future use.
236
- *
237
- * IMPLEMENTATION STATUS:
238
- * - AnthropicProvider: ✅ Implemented
239
- * - VercelAIProvider: ❌ Not implemented (not needed for current workflows)
227
+ * Used by remediate and operate tools for AI-driven investigations.
240
228
  *
241
229
  * @param config Tool loop configuration with system prompt, tools, and executor
242
230
  * @returns Agentic result with final message, iterations, tool calls, and token usage
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provider.interface.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider.interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-provider.interface.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider.interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * ArtifactHub API Client
3
+ *
4
+ * Handles searching and retrieving Helm chart information from ArtifactHub
5
+ * API Documentation: https://artifacthub.io/docs/api/
6
+ */
7
+ /**
8
+ * Raw search result from ArtifactHub API
9
+ */
10
+ export interface ArtifactHubSearchResult {
11
+ package_id: string;
12
+ name: string;
13
+ normalized_name: string;
14
+ logo_image_id?: string;
15
+ stars: number;
16
+ official: boolean;
17
+ verified_publisher: boolean;
18
+ repository: {
19
+ name: string;
20
+ url: string;
21
+ official: boolean;
22
+ verified_publisher: boolean;
23
+ };
24
+ version: string;
25
+ app_version?: string;
26
+ description: string;
27
+ }
28
+ /**
29
+ * Raw package details from ArtifactHub API
30
+ */
31
+ export interface ArtifactHubPackageDetails {
32
+ package_id: string;
33
+ name: string;
34
+ normalized_name: string;
35
+ version: string;
36
+ app_version?: string;
37
+ description: string;
38
+ readme?: string;
39
+ values_schema?: Record<string, any>;
40
+ default_values?: string;
41
+ repository: {
42
+ name: string;
43
+ url: string;
44
+ };
45
+ maintainers?: Array<{
46
+ name: string;
47
+ email?: string;
48
+ }>;
49
+ links?: Array<{
50
+ name: string;
51
+ url: string;
52
+ }>;
53
+ }
54
+ /**
55
+ * ArtifactHub API client for Helm chart discovery
56
+ */
57
+ export declare class ArtifactHubService {
58
+ private baseUrl;
59
+ private timeout;
60
+ private excludedRepos;
61
+ /**
62
+ * Search for Helm charts matching the query
63
+ *
64
+ * @param query - Search query (e.g., "argo cd", "prometheus")
65
+ * @param limit - Maximum number of results to return
66
+ * @returns Array of search results sorted by relevance (excludes Bitnami)
67
+ */
68
+ searchCharts(query: string, limit?: number): Promise<ArtifactHubSearchResult[]>;
69
+ /**
70
+ * Get detailed information about a specific chart
71
+ *
72
+ * @param repoName - Repository name (e.g., "argo")
73
+ * @param chartName - Chart name (e.g., "argo-cd")
74
+ * @returns Detailed chart information including README and values schema
75
+ */
76
+ getChartDetails(repoName: string, chartName: string): Promise<ArtifactHubPackageDetails>;
77
+ /**
78
+ * Format chart results for AI analysis prompt
79
+ *
80
+ * @param charts - Array of ArtifactHub search results
81
+ * @returns Formatted string for AI prompt
82
+ */
83
+ formatChartsForAI(charts: ArtifactHubSearchResult[]): string;
84
+ }
85
+ //# sourceMappingURL=artifacthub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacthub.d.ts","sourceRoot":"","sources":["../../src/core/artifacthub.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,OAAO,CAAS;IAIxB,OAAO,CAAC,aAAa,CAAe;IAEpC;;;;;;OAMG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAsCzF;;;;;;OAMG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA8B9F;;;;;OAKG;IACH,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM;CAW7D"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * ArtifactHub API Client
4
+ *
5
+ * Handles searching and retrieving Helm chart information from ArtifactHub
6
+ * API Documentation: https://artifacthub.io/docs/api/
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ArtifactHubService = void 0;
10
+ /**
11
+ * ArtifactHub API client for Helm chart discovery
12
+ */
13
+ class ArtifactHubService {
14
+ baseUrl = 'https://artifacthub.io/api/v1';
15
+ timeout = 10000; // 10 seconds
16
+ // Repositories to exclude from search results
17
+ // Bitnami charts often have non-standard configurations
18
+ excludedRepos = ['bitnami'];
19
+ /**
20
+ * Search for Helm charts matching the query
21
+ *
22
+ * @param query - Search query (e.g., "argo cd", "prometheus")
23
+ * @param limit - Maximum number of results to return
24
+ * @returns Array of search results sorted by relevance (excludes Bitnami)
25
+ */
26
+ async searchCharts(query, limit = 10) {
27
+ const encodedQuery = encodeURIComponent(query);
28
+ // kind=0 filters for Helm charts only
29
+ const url = `${this.baseUrl}/packages/search?ts_query_web=${encodedQuery}&kind=0&limit=${limit}`;
30
+ try {
31
+ const controller = new AbortController();
32
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
33
+ const response = await fetch(url, {
34
+ method: 'GET',
35
+ headers: {
36
+ 'Accept': 'application/json',
37
+ },
38
+ signal: controller.signal,
39
+ });
40
+ clearTimeout(timeoutId);
41
+ if (!response.ok) {
42
+ throw new Error(`ArtifactHub API error: ${response.status} ${response.statusText}`);
43
+ }
44
+ const data = await response.json();
45
+ // Filter out excluded repositories (e.g., Bitnami)
46
+ const packages = data.packages || [];
47
+ return packages.filter(pkg => !this.excludedRepos.includes(pkg.repository.name.toLowerCase()));
48
+ }
49
+ catch (error) {
50
+ if (error instanceof Error && error.name === 'AbortError') {
51
+ throw new Error(`ArtifactHub API timeout after ${this.timeout}ms`);
52
+ }
53
+ throw new Error(`ArtifactHub search failed: ${error instanceof Error ? error.message : String(error)}`);
54
+ }
55
+ }
56
+ /**
57
+ * Get detailed information about a specific chart
58
+ *
59
+ * @param repoName - Repository name (e.g., "argo")
60
+ * @param chartName - Chart name (e.g., "argo-cd")
61
+ * @returns Detailed chart information including README and values schema
62
+ */
63
+ async getChartDetails(repoName, chartName) {
64
+ const url = `${this.baseUrl}/packages/helm/${repoName}/${chartName}`;
65
+ try {
66
+ const controller = new AbortController();
67
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
68
+ const response = await fetch(url, {
69
+ method: 'GET',
70
+ headers: {
71
+ 'Accept': 'application/json',
72
+ },
73
+ signal: controller.signal,
74
+ });
75
+ clearTimeout(timeoutId);
76
+ if (!response.ok) {
77
+ throw new Error(`ArtifactHub API error: ${response.status} ${response.statusText}`);
78
+ }
79
+ return await response.json();
80
+ }
81
+ catch (error) {
82
+ if (error instanceof Error && error.name === 'AbortError') {
83
+ throw new Error(`ArtifactHub API timeout after ${this.timeout}ms`);
84
+ }
85
+ throw new Error(`ArtifactHub chart details failed: ${error instanceof Error ? error.message : String(error)}`);
86
+ }
87
+ }
88
+ /**
89
+ * Format chart results for AI analysis prompt
90
+ *
91
+ * @param charts - Array of ArtifactHub search results
92
+ * @returns Formatted string for AI prompt
93
+ */
94
+ formatChartsForAI(charts) {
95
+ return charts.map((chart, index) => `
96
+ Chart ${index + 1}: ${chart.name}
97
+ Repository: ${chart.repository.name} (${chart.repository.url})
98
+ Version: ${chart.version}${chart.app_version ? ` (App: ${chart.app_version})` : ''}
99
+ Description: ${chart.description || 'No description'}
100
+ Official: ${chart.official || chart.repository.official ? 'Yes' : 'No'}
101
+ Verified Publisher: ${chart.verified_publisher || chart.repository.verified_publisher ? 'Yes' : 'No'}
102
+ Stars: ${chart.stars}
103
+ `).join('\n');
104
+ }
105
+ }
106
+ exports.ArtifactHubService = ArtifactHubService;
@@ -39,7 +39,7 @@ class VercelEmbeddingProvider {
39
39
  break;
40
40
  case 'google':
41
41
  this.apiKey = config.apiKey || process.env.GOOGLE_API_KEY || '';
42
- this.model = config.model || 'text-embedding-004';
42
+ this.model = config.model || process.env.EMBEDDINGS_MODEL || 'gemini-embedding-001';
43
43
  this.dimensions = config.dimensions || 768;
44
44
  break;
45
45
  case 'amazon_bedrock':
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Type definitions for Helm-based solutions and sessions
3
+ */
4
+ /**
5
+ * Helm chart information from ArtifactHub
6
+ */
7
+ export interface HelmChartInfo {
8
+ repository: string;
9
+ repositoryName: string;
10
+ chartName: string;
11
+ version?: string;
12
+ appVersion?: string;
13
+ official?: boolean;
14
+ verifiedPublisher?: boolean;
15
+ }
16
+ /**
17
+ * Solution data for Helm-based installations
18
+ * Stored in sol-* sessions alongside capability-based solutions
19
+ */
20
+ export interface HelmSolutionData {
21
+ intent: string;
22
+ type: 'helm';
23
+ chart: HelmChartInfo;
24
+ score: number;
25
+ description: string;
26
+ reasons: string[];
27
+ questions?: {
28
+ required?: any[];
29
+ basic?: any[];
30
+ advanced?: any[];
31
+ };
32
+ answers: Record<string, any>;
33
+ generatedValues?: Record<string, any>;
34
+ helmCommand?: string;
35
+ namespace?: string;
36
+ releaseName?: string;
37
+ timestamp: string;
38
+ }
39
+ //# sourceMappingURL=helm-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helm-types.d.ts","sourceRoot":"","sources":["../../src/core/helm-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACd,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for Helm-based solutions and sessions
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Helm Utilities - Shared functions for Helm chart operations
3
+ */
4
+ import { HelmChartInfo } from './helm-types';
5
+ /**
6
+ * Sanitize input for safe shell command usage.
7
+ * Validates that input contains only safe characters to prevent command injection.
8
+ * @throws Error if input contains potentially dangerous characters
9
+ */
10
+ export declare function sanitizeShellArg(arg: string, fieldName?: string): string;
11
+ /**
12
+ * Validate and sanitize HelmChartInfo for safe shell command usage
13
+ */
14
+ export declare function sanitizeChartInfo(chart: HelmChartInfo): {
15
+ repositoryName: string;
16
+ repository: string;
17
+ chartName: string;
18
+ version?: string;
19
+ };
20
+ /**
21
+ * Build the Helm command from chart info and deployment options
22
+ */
23
+ export declare function buildHelmCommand(chart: HelmChartInfo, releaseName: string, namespace: string, valuesPath?: string): string;
24
+ /**
25
+ * Ensure Helm repository is added and updated
26
+ */
27
+ export declare function ensureHelmRepo(chart: HelmChartInfo): Promise<void>;
28
+ /**
29
+ * Execute a Helm command with proper error handling
30
+ */
31
+ export declare function executeHelmCommand(command: string, options?: {
32
+ timeout?: number;
33
+ maxBuffer?: number;
34
+ }): Promise<{
35
+ stdout: string;
36
+ stderr: string;
37
+ }>;
38
+ /**
39
+ * Get the path for Helm values file
40
+ */
41
+ export declare function getHelmValuesPath(solutionId: string): string;
42
+ /**
43
+ * Check if Helm values file exists for a solution
44
+ */
45
+ export declare function helmValuesExist(solutionId: string): boolean;
46
+ /**
47
+ * Ensure tmp directory exists
48
+ */
49
+ export declare function ensureTmpDir(): string;
50
+ /**
51
+ * Result of Helm command execution
52
+ */
53
+ export interface HelmExecutionResult {
54
+ success: boolean;
55
+ output: string;
56
+ error?: string;
57
+ }
58
+ /**
59
+ * Run Helm dry-run validation
60
+ */
61
+ export declare function validateHelmDryRun(chart: HelmChartInfo, releaseName: string, namespace: string, valuesPath: string): Promise<HelmExecutionResult>;
62
+ /**
63
+ * Deploy a Helm chart
64
+ */
65
+ export declare function deployHelmRelease(chart: HelmChartInfo, releaseName: string, namespace: string, valuesPath: string | undefined, timeout: number): Promise<HelmExecutionResult>;
66
+ //# sourceMappingURL=helm-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helm-utils.d.ts","sourceRoot":"","sources":["../../src/core/helm-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAmB,GAAG,MAAM,CAOpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAOA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAO7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAyB9B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CA6B9B"}