@pax8-cta/core 0.1.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/LICENSE +198 -0
- package/dist/auth/device-code-login.d.ts +40 -0
- package/dist/auth/device-code-login.d.ts.map +1 -0
- package/dist/auth/device-code-login.js +59 -0
- package/dist/auth/device-code-login.js.map +1 -0
- package/dist/auth/gdap-client.d.ts +81 -0
- package/dist/auth/gdap-client.d.ts.map +1 -0
- package/dist/auth/gdap-client.js +128 -0
- package/dist/auth/gdap-client.js.map +1 -0
- package/dist/auth/index.d.ts +19 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +19 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token-manager.d.ts +54 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +150 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +27 -0
- package/dist/client.js.map +1 -0
- package/dist/config/client.d.ts +24 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +18 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/index.d.ts +18 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +18 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +271 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +751 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +556 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.d.ts +116 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +170 -0
- package/dist/constants.js.map +1 -0
- package/dist/dataverse/agent-resolver.d.ts +98 -0
- package/dist/dataverse/agent-resolver.d.ts.map +1 -0
- package/dist/dataverse/agent-resolver.js +185 -0
- package/dist/dataverse/agent-resolver.js.map +1 -0
- package/dist/dataverse/client.d.ts +104 -0
- package/dist/dataverse/client.d.ts.map +1 -0
- package/dist/dataverse/client.js +272 -0
- package/dist/dataverse/client.js.map +1 -0
- package/dist/dataverse/connection-refs.d.ts +115 -0
- package/dist/dataverse/connection-refs.d.ts.map +1 -0
- package/dist/dataverse/connection-refs.js +203 -0
- package/dist/dataverse/connection-refs.js.map +1 -0
- package/dist/dataverse/index.d.ts +20 -0
- package/dist/dataverse/index.d.ts.map +1 -0
- package/dist/dataverse/index.js +20 -0
- package/dist/dataverse/index.js.map +1 -0
- package/dist/dataverse/solution-ops.d.ts +100 -0
- package/dist/dataverse/solution-ops.d.ts.map +1 -0
- package/dist/dataverse/solution-ops.js +288 -0
- package/dist/dataverse/solution-ops.js.map +1 -0
- package/dist/errors.d.ts +171 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +178 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mock/demo-data.d.ts +213 -0
- package/dist/mock/demo-data.d.ts.map +1 -0
- package/dist/mock/demo-data.js +1096 -0
- package/dist/mock/demo-data.js.map +1 -0
- package/dist/mock/demo-deployment-store.d.ts +77 -0
- package/dist/mock/demo-deployment-store.d.ts.map +1 -0
- package/dist/mock/demo-deployment-store.js +85 -0
- package/dist/mock/demo-deployment-store.js.map +1 -0
- package/dist/powerplatform/admin-client.d.ts +226 -0
- package/dist/powerplatform/admin-client.d.ts.map +1 -0
- package/dist/powerplatform/admin-client.js +315 -0
- package/dist/powerplatform/admin-client.js.map +1 -0
- package/dist/powerplatform/index.d.ts +18 -0
- package/dist/powerplatform/index.d.ts.map +1 -0
- package/dist/powerplatform/index.js +18 -0
- package/dist/powerplatform/index.js.map +1 -0
- package/dist/powerplatform/tenant-discovery.d.ts +100 -0
- package/dist/powerplatform/tenant-discovery.d.ts.map +1 -0
- package/dist/powerplatform/tenant-discovery.js +205 -0
- package/dist/powerplatform/tenant-discovery.js.map +1 -0
- package/dist/preconditions/check.d.ts +41 -0
- package/dist/preconditions/check.d.ts.map +1 -0
- package/dist/preconditions/check.js +173 -0
- package/dist/preconditions/check.js.map +1 -0
- package/dist/preconditions/index.d.ts +20 -0
- package/dist/preconditions/index.d.ts.map +1 -0
- package/dist/preconditions/index.js +20 -0
- package/dist/preconditions/index.js.map +1 -0
- package/dist/preconditions/loader.d.ts +33 -0
- package/dist/preconditions/loader.d.ts.map +1 -0
- package/dist/preconditions/loader.js +65 -0
- package/dist/preconditions/loader.js.map +1 -0
- package/dist/preconditions/schema.d.ts +103 -0
- package/dist/preconditions/schema.d.ts.map +1 -0
- package/dist/preconditions/schema.js +93 -0
- package/dist/preconditions/schema.js.map +1 -0
- package/dist/preconditions/types.d.ts +118 -0
- package/dist/preconditions/types.d.ts.map +1 -0
- package/dist/preconditions/types.js +17 -0
- package/dist/preconditions/types.js.map +1 -0
- package/dist/queue/index.d.ts +17 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +17 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/memory-queue.d.ts +86 -0
- package/dist/queue/memory-queue.d.ts.map +1 -0
- package/dist/queue/memory-queue.js +221 -0
- package/dist/queue/memory-queue.js.map +1 -0
- package/dist/services/audit-log.d.ts +59 -0
- package/dist/services/audit-log.d.ts.map +1 -0
- package/dist/services/audit-log.js +193 -0
- package/dist/services/audit-log.js.map +1 -0
- package/dist/services/auth-error-parser.d.ts +36 -0
- package/dist/services/auth-error-parser.d.ts.map +1 -0
- package/dist/services/auth-error-parser.js +90 -0
- package/dist/services/auth-error-parser.js.map +1 -0
- package/dist/services/deployment-doctor.d.ts +109 -0
- package/dist/services/deployment-doctor.d.ts.map +1 -0
- package/dist/services/deployment-doctor.js +476 -0
- package/dist/services/deployment-doctor.js.map +1 -0
- package/dist/services/deployment-notifications.d.ts +41 -0
- package/dist/services/deployment-notifications.d.ts.map +1 -0
- package/dist/services/deployment-notifications.js +161 -0
- package/dist/services/deployment-notifications.js.map +1 -0
- package/dist/services/deployment-progress.d.ts +89 -0
- package/dist/services/deployment-progress.d.ts.map +1 -0
- package/dist/services/deployment-progress.js +244 -0
- package/dist/services/deployment-progress.js.map +1 -0
- package/dist/services/deployment-service.d.ts +97 -0
- package/dist/services/deployment-service.d.ts.map +1 -0
- package/dist/services/deployment-service.js +375 -0
- package/dist/services/deployment-service.js.map +1 -0
- package/dist/services/drift-analyzer.d.ts +86 -0
- package/dist/services/drift-analyzer.d.ts.map +1 -0
- package/dist/services/drift-analyzer.js +273 -0
- package/dist/services/drift-analyzer.js.map +1 -0
- package/dist/services/environment-setup.d.ts +97 -0
- package/dist/services/environment-setup.d.ts.map +1 -0
- package/dist/services/environment-setup.js +250 -0
- package/dist/services/environment-setup.js.map +1 -0
- package/dist/services/health-check.d.ts +168 -0
- package/dist/services/health-check.d.ts.map +1 -0
- package/dist/services/health-check.js +705 -0
- package/dist/services/health-check.js.map +1 -0
- package/dist/services/index.d.ts +39 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/logger.d.ts +139 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/notification-service.d.ts +55 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +184 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/risk-analyzer.d.ts +252 -0
- package/dist/services/risk-analyzer.d.ts.map +1 -0
- package/dist/services/risk-analyzer.js +866 -0
- package/dist/services/risk-analyzer.js.map +1 -0
- package/dist/services/rollback.d.ts +57 -0
- package/dist/services/rollback.d.ts.map +1 -0
- package/dist/services/rollback.js +270 -0
- package/dist/services/rollback.js.map +1 -0
- package/dist/services/scheduler.d.ts +80 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +350 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/secrets.d.ts +31 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +206 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/settings-service.d.ts +132 -0
- package/dist/services/settings-service.d.ts.map +1 -0
- package/dist/services/settings-service.js +378 -0
- package/dist/services/settings-service.js.map +1 -0
- package/dist/services/solution-diff.d.ts +127 -0
- package/dist/services/solution-diff.d.ts.map +1 -0
- package/dist/services/solution-diff.js +260 -0
- package/dist/services/solution-diff.js.map +1 -0
- package/dist/services/solution-mode-detector.d.ts +35 -0
- package/dist/services/solution-mode-detector.d.ts.map +1 -0
- package/dist/services/solution-mode-detector.js +84 -0
- package/dist/services/solution-mode-detector.js.map +1 -0
- package/dist/services/tenant-resolver.d.ts +55 -0
- package/dist/services/tenant-resolver.d.ts.map +1 -0
- package/dist/services/tenant-resolver.js +126 -0
- package/dist/services/tenant-resolver.js.map +1 -0
- package/dist/services/unmanaged-customizations.d.ts +104 -0
- package/dist/services/unmanaged-customizations.d.ts.map +1 -0
- package/dist/services/unmanaged-customizations.js +521 -0
- package/dist/services/unmanaged-customizations.js.map +1 -0
- package/dist/services/url-templater.d.ts +184 -0
- package/dist/services/url-templater.d.ts.map +1 -0
- package/dist/services/url-templater.js +327 -0
- package/dist/services/url-templater.js.map +1 -0
- package/dist/services/version-checker.d.ts +108 -0
- package/dist/services/version-checker.d.ts.map +1 -0
- package/dist/services/version-checker.js +403 -0
- package/dist/services/version-checker.js.map +1 -0
- package/dist/services/waves.d.ts +90 -0
- package/dist/services/waves.d.ts.map +1 -0
- package/dist/services/waves.js +222 -0
- package/dist/services/waves.js.map +1 -0
- package/dist/services/webhook.d.ts +95 -0
- package/dist/services/webhook.d.ts.map +1 -0
- package/dist/services/webhook.js +244 -0
- package/dist/services/webhook.js.map +1 -0
- package/dist/utils/deployment-tools.d.ts +110 -0
- package/dist/utils/deployment-tools.d.ts.map +1 -0
- package/dist/utils/deployment-tools.js +121 -0
- package/dist/utils/deployment-tools.js.map +1 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* AI-Powered Deployment Doctor
|
|
18
|
+
*
|
|
19
|
+
* Analyzes deployment failures and provides intelligent remediation guidance.
|
|
20
|
+
* Uses pattern matching + AI to identify root causes and suggest fixes.
|
|
21
|
+
*/
|
|
22
|
+
export type ErrorCategory = "authentication" | "authorization" | "network" | "timeout" | "conflict" | "dependency" | "configuration" | "resource_limit" | "validation" | "unknown";
|
|
23
|
+
export interface ErrorPattern {
|
|
24
|
+
category: ErrorCategory;
|
|
25
|
+
patterns: RegExp[];
|
|
26
|
+
confidence: number;
|
|
27
|
+
description: string;
|
|
28
|
+
commonCauses: string[];
|
|
29
|
+
remediationSteps: string[];
|
|
30
|
+
autoFixable: boolean;
|
|
31
|
+
autoFixAction?: "retry" | "retry_with_delay" | "update_config" | "request_admin_action";
|
|
32
|
+
}
|
|
33
|
+
export interface FailureAnalysis {
|
|
34
|
+
deploymentId: string;
|
|
35
|
+
tenantId: string;
|
|
36
|
+
tenantName: string;
|
|
37
|
+
errorMessage: string;
|
|
38
|
+
category: ErrorCategory;
|
|
39
|
+
confidence: number;
|
|
40
|
+
rootCause: string;
|
|
41
|
+
remediationPlan: {
|
|
42
|
+
priority: "critical" | "high" | "medium" | "low";
|
|
43
|
+
estimatedEffort: "quick" | "moderate" | "complex";
|
|
44
|
+
steps: Array<{
|
|
45
|
+
order: number;
|
|
46
|
+
action: string;
|
|
47
|
+
description: string;
|
|
48
|
+
automated: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
preventionTips?: string[];
|
|
51
|
+
};
|
|
52
|
+
similarFailures?: Array<{
|
|
53
|
+
deploymentId: string;
|
|
54
|
+
tenantName: string;
|
|
55
|
+
resolved: boolean;
|
|
56
|
+
resolution?: string;
|
|
57
|
+
}>;
|
|
58
|
+
autoFixSuggestion?: {
|
|
59
|
+
action: "retry" | "retry_with_delay" | "update_config" | "request_admin_action";
|
|
60
|
+
parameters?: Record<string, unknown>;
|
|
61
|
+
safetyNote?: string;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface FleetHealthInsight {
|
|
65
|
+
pattern: string;
|
|
66
|
+
affectedDeployments: number;
|
|
67
|
+
affectedTenants: string[];
|
|
68
|
+
severity: "critical" | "warning" | "info";
|
|
69
|
+
recommendation: string;
|
|
70
|
+
trend?: "increasing" | "stable" | "decreasing";
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Deployment Doctor Service
|
|
74
|
+
*/
|
|
75
|
+
export declare class DeploymentDoctor {
|
|
76
|
+
/**
|
|
77
|
+
* Categorize an error message
|
|
78
|
+
*/
|
|
79
|
+
categorizeError(errorMessage: string): {
|
|
80
|
+
category: ErrorCategory;
|
|
81
|
+
confidence: number;
|
|
82
|
+
matchedPattern?: ErrorPattern;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Analyze a single deployment failure
|
|
86
|
+
*/
|
|
87
|
+
analyzeFailure(deploymentId: string, tenantId: string, tenantName: string, errorMessage: string, deploymentHistory?: Array<{
|
|
88
|
+
deploymentId: string;
|
|
89
|
+
tenantName: string;
|
|
90
|
+
error?: string;
|
|
91
|
+
resolved?: boolean;
|
|
92
|
+
}>): FailureAnalysis;
|
|
93
|
+
/**
|
|
94
|
+
* Analyze multiple failures to identify fleet-wide patterns
|
|
95
|
+
*/
|
|
96
|
+
analyzeFleetPatterns(failures: Array<{
|
|
97
|
+
deploymentId: string;
|
|
98
|
+
tenantId: string;
|
|
99
|
+
tenantName: string;
|
|
100
|
+
error: string;
|
|
101
|
+
timestamp: string;
|
|
102
|
+
}>): FleetHealthInsight[];
|
|
103
|
+
/**
|
|
104
|
+
* Generate a concise action title from a remediation step
|
|
105
|
+
*/
|
|
106
|
+
private generateActionTitle;
|
|
107
|
+
}
|
|
108
|
+
export declare function getDeploymentDoctor(): DeploymentDoctor;
|
|
109
|
+
//# sourceMappingURL=deployment-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-doctor.d.ts","sourceRoot":"","sources":["../../src/services/deployment-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Knowledge base of error patterns and remediations
|
|
18
|
+
*/
|
|
19
|
+
const ERROR_PATTERNS = [
|
|
20
|
+
// Authentication errors
|
|
21
|
+
{
|
|
22
|
+
category: "authentication",
|
|
23
|
+
patterns: [
|
|
24
|
+
/invalid_client/i,
|
|
25
|
+
/unauthorized/i,
|
|
26
|
+
/authentication.*failed/i,
|
|
27
|
+
/AADSTS\d+/i,
|
|
28
|
+
/token.*expired/i,
|
|
29
|
+
/invalid.*credentials/i,
|
|
30
|
+
],
|
|
31
|
+
confidence: 0.95,
|
|
32
|
+
description: "Authentication failure with Azure AD or Dataverse",
|
|
33
|
+
commonCauses: [
|
|
34
|
+
"Service principal credentials expired or invalid",
|
|
35
|
+
"Client secret needs renewal",
|
|
36
|
+
"App registration misconfigured",
|
|
37
|
+
"Token cache issues",
|
|
38
|
+
],
|
|
39
|
+
remediationSteps: [
|
|
40
|
+
"Verify service principal credentials in Azure Portal",
|
|
41
|
+
"Check if client secret has expired",
|
|
42
|
+
"Ensure app registration has correct API permissions",
|
|
43
|
+
"Clear token cache and retry",
|
|
44
|
+
"Verify GDAP relationship is active",
|
|
45
|
+
],
|
|
46
|
+
autoFixable: true,
|
|
47
|
+
autoFixAction: "retry",
|
|
48
|
+
},
|
|
49
|
+
// Authorization / Permission errors
|
|
50
|
+
{
|
|
51
|
+
category: "authorization",
|
|
52
|
+
patterns: [
|
|
53
|
+
/insufficient.*privileges/i,
|
|
54
|
+
/access.*denied/i,
|
|
55
|
+
/forbidden/i,
|
|
56
|
+
/privilege.*missing/i,
|
|
57
|
+
/prvWrite/i,
|
|
58
|
+
/prvCreate/i,
|
|
59
|
+
/Missing privilege/i,
|
|
60
|
+
],
|
|
61
|
+
confidence: 0.98,
|
|
62
|
+
description: "Missing permissions or GDAP role insufficient",
|
|
63
|
+
commonCauses: [
|
|
64
|
+
"GDAP role lacks required Dynamics 365 privileges",
|
|
65
|
+
"User does not have System Administrator role",
|
|
66
|
+
"Power Platform Admin role not assigned",
|
|
67
|
+
"Environment security not configured correctly",
|
|
68
|
+
],
|
|
69
|
+
remediationSteps: [
|
|
70
|
+
"Go to Partner Center → Customers → select customer",
|
|
71
|
+
'Request "Power Platform Admin" or "Dynamics 365 Admin" role',
|
|
72
|
+
"Wait for customer approval (can take hours/days)",
|
|
73
|
+
"Alternatively: Ask customer to add service principal to environment with System Admin role",
|
|
74
|
+
"Retry deployment after role assignment",
|
|
75
|
+
],
|
|
76
|
+
autoFixable: false,
|
|
77
|
+
autoFixAction: "request_admin_action",
|
|
78
|
+
},
|
|
79
|
+
// Network errors
|
|
80
|
+
{
|
|
81
|
+
category: "network",
|
|
82
|
+
patterns: [
|
|
83
|
+
/network.*error/i,
|
|
84
|
+
/connection.*refused/i,
|
|
85
|
+
/ECONNREFUSED/i,
|
|
86
|
+
/ECONNRESET/i,
|
|
87
|
+
/ETIMEDOUT/i,
|
|
88
|
+
/socket.*hang/i,
|
|
89
|
+
/dns.*lookup.*failed/i,
|
|
90
|
+
],
|
|
91
|
+
confidence: 0.9,
|
|
92
|
+
description: "Network connectivity issue to tenant environment",
|
|
93
|
+
commonCauses: [
|
|
94
|
+
"Tenant environment temporarily unavailable",
|
|
95
|
+
"Network firewall blocking requests",
|
|
96
|
+
"DNS resolution failure",
|
|
97
|
+
"Dataverse API throttling",
|
|
98
|
+
"ISP or Azure network issue",
|
|
99
|
+
],
|
|
100
|
+
remediationSteps: [
|
|
101
|
+
"Verify tenant environment URL is correct",
|
|
102
|
+
"Check tenant environment is online (Power Platform Admin Center)",
|
|
103
|
+
"Wait 5-10 minutes and retry (transient issue)",
|
|
104
|
+
"Check firewall rules allow outbound HTTPS to *.dynamics.com",
|
|
105
|
+
"Verify no service outages on Azure Status page",
|
|
106
|
+
],
|
|
107
|
+
autoFixable: true,
|
|
108
|
+
autoFixAction: "retry_with_delay",
|
|
109
|
+
},
|
|
110
|
+
// Timeout errors
|
|
111
|
+
{
|
|
112
|
+
category: "timeout",
|
|
113
|
+
patterns: [/timeout/i, /timed out/i, /operation.*exceeded.*time/i, /request.*took too long/i],
|
|
114
|
+
confidence: 0.85,
|
|
115
|
+
description: "Operation exceeded time limit",
|
|
116
|
+
commonCauses: [
|
|
117
|
+
"Large solution file taking too long to import",
|
|
118
|
+
"Tenant environment under heavy load",
|
|
119
|
+
"Solution has complex dependencies that slow import",
|
|
120
|
+
"Dataverse import queue backlog",
|
|
121
|
+
],
|
|
122
|
+
remediationSteps: [
|
|
123
|
+
"Retry during off-peak hours (evenings/weekends)",
|
|
124
|
+
"Check tenant environment performance in admin center",
|
|
125
|
+
"Consider breaking solution into smaller components",
|
|
126
|
+
"Increase timeout limit in deployment configuration",
|
|
127
|
+
"Contact Microsoft support if persistent",
|
|
128
|
+
],
|
|
129
|
+
autoFixable: true,
|
|
130
|
+
autoFixAction: "retry_with_delay",
|
|
131
|
+
},
|
|
132
|
+
// Conflict errors
|
|
133
|
+
{
|
|
134
|
+
category: "conflict",
|
|
135
|
+
patterns: [
|
|
136
|
+
/already exists/i,
|
|
137
|
+
/duplicate/i,
|
|
138
|
+
/conflict/i,
|
|
139
|
+
/name.*is already in use/i,
|
|
140
|
+
/solution.*already installed/i,
|
|
141
|
+
],
|
|
142
|
+
confidence: 0.92,
|
|
143
|
+
description: "Resource conflict with existing component",
|
|
144
|
+
commonCauses: [
|
|
145
|
+
"Solution already installed (maybe older version)",
|
|
146
|
+
"Agent with same name exists in environment",
|
|
147
|
+
"Conflicting component from another solution",
|
|
148
|
+
"Previous deployment partially completed",
|
|
149
|
+
],
|
|
150
|
+
remediationSteps: [
|
|
151
|
+
"Check if solution is already installed in environment",
|
|
152
|
+
"Upgrade existing solution instead of new install",
|
|
153
|
+
"Remove conflicting component manually",
|
|
154
|
+
"Use unique names for agents/components",
|
|
155
|
+
"Perform rollback if previous deployment is incomplete",
|
|
156
|
+
],
|
|
157
|
+
autoFixable: false,
|
|
158
|
+
autoFixAction: "request_admin_action",
|
|
159
|
+
},
|
|
160
|
+
// Dependency errors
|
|
161
|
+
{
|
|
162
|
+
category: "dependency",
|
|
163
|
+
patterns: [
|
|
164
|
+
/missing.*dependency/i,
|
|
165
|
+
/dependent.*component/i,
|
|
166
|
+
/requires.*connector/i,
|
|
167
|
+
/connection.*reference.*not found/i,
|
|
168
|
+
/environment.*variable.*not found/i,
|
|
169
|
+
],
|
|
170
|
+
confidence: 0.94,
|
|
171
|
+
description: "Missing dependencies or connection references",
|
|
172
|
+
commonCauses: [
|
|
173
|
+
"Required connectors not installed in tenant",
|
|
174
|
+
"Connection references not mapped correctly",
|
|
175
|
+
"Environment variables not configured",
|
|
176
|
+
"Dependent solution not installed",
|
|
177
|
+
],
|
|
178
|
+
remediationSteps: [
|
|
179
|
+
"Review solution dependencies in source environment",
|
|
180
|
+
"Install required connectors in target environment",
|
|
181
|
+
"Update tenant configuration with correct connection mappings",
|
|
182
|
+
"Set environment variable values in tenant config",
|
|
183
|
+
"Deploy dependency solutions first, then main solution",
|
|
184
|
+
],
|
|
185
|
+
autoFixable: false,
|
|
186
|
+
autoFixAction: "update_config",
|
|
187
|
+
},
|
|
188
|
+
// Configuration errors
|
|
189
|
+
{
|
|
190
|
+
category: "configuration",
|
|
191
|
+
patterns: [
|
|
192
|
+
/invalid.*configuration/i,
|
|
193
|
+
/malformed/i,
|
|
194
|
+
/invalid.*format/i,
|
|
195
|
+
/validation.*failed/i,
|
|
196
|
+
/invalid.*parameter/i,
|
|
197
|
+
],
|
|
198
|
+
confidence: 0.88,
|
|
199
|
+
description: "Invalid configuration or malformed request",
|
|
200
|
+
commonCauses: [
|
|
201
|
+
"Tenant configuration has incorrect format",
|
|
202
|
+
"Environment URL is malformed",
|
|
203
|
+
"Connection mapping schema invalid",
|
|
204
|
+
"Solution file corrupted",
|
|
205
|
+
],
|
|
206
|
+
remediationSteps: [
|
|
207
|
+
"Validate tenant configuration YAML syntax",
|
|
208
|
+
"Check environment URL format (https://org.crm.dynamics.com)",
|
|
209
|
+
"Verify connection mappings follow correct schema",
|
|
210
|
+
"Re-export solution from source environment",
|
|
211
|
+
"Run configuration validation before deployment",
|
|
212
|
+
],
|
|
213
|
+
autoFixable: false,
|
|
214
|
+
autoFixAction: "update_config",
|
|
215
|
+
},
|
|
216
|
+
// Resource limits
|
|
217
|
+
{
|
|
218
|
+
category: "resource_limit",
|
|
219
|
+
patterns: [
|
|
220
|
+
/quota.*exceeded/i,
|
|
221
|
+
/too many requests/i,
|
|
222
|
+
/rate.*limit/i,
|
|
223
|
+
/throttle/i,
|
|
224
|
+
/storage.*limit/i,
|
|
225
|
+
],
|
|
226
|
+
confidence: 0.9,
|
|
227
|
+
description: "Resource quota or rate limit exceeded",
|
|
228
|
+
commonCauses: [
|
|
229
|
+
"API rate limit exceeded (too many requests)",
|
|
230
|
+
"Tenant storage quota full",
|
|
231
|
+
"Concurrent deployment limit reached",
|
|
232
|
+
"Power Platform API throttling",
|
|
233
|
+
],
|
|
234
|
+
remediationSteps: [
|
|
235
|
+
"Reduce deployment concurrency (deploy to fewer tenants at once)",
|
|
236
|
+
"Add delays between deployments",
|
|
237
|
+
"Check tenant storage usage and clean up",
|
|
238
|
+
"Upgrade tenant license for higher limits",
|
|
239
|
+
"Retry after rate limit reset (usually 5-15 minutes)",
|
|
240
|
+
],
|
|
241
|
+
autoFixable: true,
|
|
242
|
+
autoFixAction: "retry_with_delay",
|
|
243
|
+
},
|
|
244
|
+
];
|
|
245
|
+
/**
|
|
246
|
+
* Deployment Doctor Service
|
|
247
|
+
*/
|
|
248
|
+
export class DeploymentDoctor {
|
|
249
|
+
/**
|
|
250
|
+
* Categorize an error message
|
|
251
|
+
*/
|
|
252
|
+
categorizeError(errorMessage) {
|
|
253
|
+
let bestMatch;
|
|
254
|
+
let bestConfidence = 0;
|
|
255
|
+
for (const pattern of ERROR_PATTERNS) {
|
|
256
|
+
for (const regex of pattern.patterns) {
|
|
257
|
+
if (regex.test(errorMessage)) {
|
|
258
|
+
if (pattern.confidence > bestConfidence) {
|
|
259
|
+
bestMatch = pattern;
|
|
260
|
+
bestConfidence = pattern.confidence;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (bestMatch) {
|
|
266
|
+
return {
|
|
267
|
+
category: bestMatch.category,
|
|
268
|
+
confidence: bestConfidence,
|
|
269
|
+
matchedPattern: bestMatch,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
category: "unknown",
|
|
274
|
+
confidence: 0.3,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Analyze a single deployment failure
|
|
279
|
+
*/
|
|
280
|
+
analyzeFailure(deploymentId, tenantId, tenantName, errorMessage, deploymentHistory) {
|
|
281
|
+
const { category, confidence, matchedPattern } = this.categorizeError(errorMessage);
|
|
282
|
+
// Find similar failures
|
|
283
|
+
const similarFailures = deploymentHistory
|
|
284
|
+
?.filter((d) => d.error && this.categorizeError(d.error).category === category)
|
|
285
|
+
.slice(0, 5)
|
|
286
|
+
.map((d) => ({
|
|
287
|
+
deploymentId: d.deploymentId,
|
|
288
|
+
tenantName: d.tenantName,
|
|
289
|
+
resolved: d.resolved || false,
|
|
290
|
+
}));
|
|
291
|
+
// Determine priority based on category
|
|
292
|
+
const priorityMap = {
|
|
293
|
+
authentication: "critical",
|
|
294
|
+
authorization: "critical",
|
|
295
|
+
network: "high",
|
|
296
|
+
timeout: "medium",
|
|
297
|
+
conflict: "high",
|
|
298
|
+
dependency: "high",
|
|
299
|
+
configuration: "high",
|
|
300
|
+
resource_limit: "medium",
|
|
301
|
+
validation: "medium",
|
|
302
|
+
unknown: "medium",
|
|
303
|
+
};
|
|
304
|
+
// Determine effort
|
|
305
|
+
const effortMap = {
|
|
306
|
+
authentication: "quick",
|
|
307
|
+
authorization: "complex",
|
|
308
|
+
network: "quick",
|
|
309
|
+
timeout: "quick",
|
|
310
|
+
conflict: "moderate",
|
|
311
|
+
dependency: "moderate",
|
|
312
|
+
configuration: "moderate",
|
|
313
|
+
resource_limit: "moderate",
|
|
314
|
+
validation: "moderate",
|
|
315
|
+
unknown: "complex",
|
|
316
|
+
};
|
|
317
|
+
// Build remediation steps
|
|
318
|
+
const steps = matchedPattern
|
|
319
|
+
? matchedPattern.remediationSteps.map((step, i) => ({
|
|
320
|
+
order: i + 1,
|
|
321
|
+
action: this.generateActionTitle(step),
|
|
322
|
+
description: step,
|
|
323
|
+
automated: i === 0 && matchedPattern.autoFixable,
|
|
324
|
+
}))
|
|
325
|
+
: [
|
|
326
|
+
{
|
|
327
|
+
order: 1,
|
|
328
|
+
action: "Investigate Error",
|
|
329
|
+
description: "Review the full error message and deployment logs",
|
|
330
|
+
automated: false,
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
order: 2,
|
|
334
|
+
action: "Check Environment Health",
|
|
335
|
+
description: "Verify tenant environment is accessible and healthy",
|
|
336
|
+
automated: false,
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
order: 3,
|
|
340
|
+
action: "Contact Support",
|
|
341
|
+
description: "If issue persists, contact Microsoft support with deployment details",
|
|
342
|
+
automated: false,
|
|
343
|
+
},
|
|
344
|
+
];
|
|
345
|
+
// Build auto-fix suggestion
|
|
346
|
+
let autoFixSuggestion;
|
|
347
|
+
if (matchedPattern?.autoFixable && matchedPattern.autoFixAction) {
|
|
348
|
+
autoFixSuggestion = {
|
|
349
|
+
action: matchedPattern.autoFixAction,
|
|
350
|
+
parameters: matchedPattern.autoFixAction === "retry_with_delay" ? { delayMs: 300000 } : undefined,
|
|
351
|
+
safetyNote: matchedPattern.autoFixAction === "retry"
|
|
352
|
+
? "Safe to retry immediately - no configuration changes needed"
|
|
353
|
+
: "Will wait 5 minutes before retrying to allow transient issues to resolve",
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
deploymentId,
|
|
358
|
+
tenantId,
|
|
359
|
+
tenantName,
|
|
360
|
+
errorMessage,
|
|
361
|
+
category,
|
|
362
|
+
confidence,
|
|
363
|
+
rootCause: matchedPattern?.description || "Unknown error - requires manual investigation",
|
|
364
|
+
remediationPlan: {
|
|
365
|
+
priority: priorityMap[category],
|
|
366
|
+
estimatedEffort: effortMap[category],
|
|
367
|
+
steps,
|
|
368
|
+
preventionTips: matchedPattern?.commonCauses
|
|
369
|
+
? [`Common causes: ${matchedPattern.commonCauses.join(", ")}`]
|
|
370
|
+
: undefined,
|
|
371
|
+
},
|
|
372
|
+
similarFailures,
|
|
373
|
+
autoFixSuggestion,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Analyze multiple failures to identify fleet-wide patterns
|
|
378
|
+
*/
|
|
379
|
+
analyzeFleetPatterns(failures) {
|
|
380
|
+
const insights = [];
|
|
381
|
+
// Group by error category
|
|
382
|
+
const categoryGroups = new Map();
|
|
383
|
+
for (const failure of failures) {
|
|
384
|
+
const { category } = this.categorizeError(failure.error);
|
|
385
|
+
if (!categoryGroups.has(category)) {
|
|
386
|
+
categoryGroups.set(category, []);
|
|
387
|
+
}
|
|
388
|
+
categoryGroups.get(category).push(failure);
|
|
389
|
+
}
|
|
390
|
+
// Generate insights for significant patterns
|
|
391
|
+
for (const [category, categoryFailures] of categoryGroups.entries()) {
|
|
392
|
+
if (categoryFailures.length >= 3) {
|
|
393
|
+
// Pattern detected
|
|
394
|
+
const affectedTenants = [...new Set(categoryFailures.map((f) => f.tenantName))];
|
|
395
|
+
let severity = "warning";
|
|
396
|
+
let recommendation = "";
|
|
397
|
+
switch (category) {
|
|
398
|
+
case "authentication":
|
|
399
|
+
severity = "critical";
|
|
400
|
+
recommendation =
|
|
401
|
+
"Multiple authentication failures detected. Check service principal credentials and GDAP status immediately.";
|
|
402
|
+
break;
|
|
403
|
+
case "authorization":
|
|
404
|
+
severity = "critical";
|
|
405
|
+
recommendation = `${affectedTenants.length} tenant${affectedTenants.length > 1 ? "s need" : " needs"} additional GDAP permissions. Request Power Platform Admin role in Partner Center.`;
|
|
406
|
+
break;
|
|
407
|
+
case "network":
|
|
408
|
+
severity = "warning";
|
|
409
|
+
recommendation =
|
|
410
|
+
"Network issues detected across multiple tenants. Check Azure service health and consider retrying later.";
|
|
411
|
+
break;
|
|
412
|
+
case "dependency":
|
|
413
|
+
severity = "warning";
|
|
414
|
+
recommendation =
|
|
415
|
+
"Missing dependencies are a common issue. Review and update tenant connection mappings before next deployment.";
|
|
416
|
+
break;
|
|
417
|
+
case "timeout":
|
|
418
|
+
severity = "info";
|
|
419
|
+
recommendation =
|
|
420
|
+
"Timeout issues detected. Consider deploying during off-peak hours or increasing timeout limits.";
|
|
421
|
+
break;
|
|
422
|
+
default:
|
|
423
|
+
recommendation = `${category} errors affecting multiple tenants. Review individual failures for details.`;
|
|
424
|
+
}
|
|
425
|
+
insights.push({
|
|
426
|
+
pattern: `${category} failures`,
|
|
427
|
+
affectedDeployments: categoryFailures.length,
|
|
428
|
+
affectedTenants,
|
|
429
|
+
severity,
|
|
430
|
+
recommendation,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// Check for tenant-specific patterns
|
|
435
|
+
const tenantFailureCounts = new Map();
|
|
436
|
+
for (const failure of failures) {
|
|
437
|
+
tenantFailureCounts.set(failure.tenantId, (tenantFailureCounts.get(failure.tenantId) || 0) + 1);
|
|
438
|
+
}
|
|
439
|
+
for (const [tenantId, count] of tenantFailureCounts.entries()) {
|
|
440
|
+
if (count >= 3) {
|
|
441
|
+
const tenant = failures.find((f) => f.tenantId === tenantId)?.tenantName;
|
|
442
|
+
insights.push({
|
|
443
|
+
pattern: "repeated failures for single tenant",
|
|
444
|
+
affectedDeployments: count,
|
|
445
|
+
affectedTenants: [tenant || tenantId],
|
|
446
|
+
severity: "critical",
|
|
447
|
+
recommendation: `Tenant '${tenant || tenantId}' has ${count} consecutive failures. Environment may have persistent issues - investigate tenant health before retrying.`,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return insights.sort((a, b) => {
|
|
452
|
+
// Sort by severity
|
|
453
|
+
const severityOrder = { critical: 0, warning: 1, info: 2 };
|
|
454
|
+
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Generate a concise action title from a remediation step
|
|
459
|
+
*/
|
|
460
|
+
generateActionTitle(step) {
|
|
461
|
+
// Extract the first few words as the action title
|
|
462
|
+
const words = step.split(" ").slice(0, 4);
|
|
463
|
+
return words.join(" ") + (step.split(" ").length > 4 ? "..." : "");
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Singleton instance
|
|
468
|
+
*/
|
|
469
|
+
let doctorInstance;
|
|
470
|
+
export function getDeploymentDoctor() {
|
|
471
|
+
if (!doctorInstance) {
|
|
472
|
+
doctorInstance = new DeploymentDoctor();
|
|
473
|
+
}
|
|
474
|
+
return doctorInstance;
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=deployment-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-doctor.js","sourceRoot":"","sources":["../../src/services/deployment-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Helper service for sending deployment lifecycle notifications
|
|
18
|
+
* Checks settings before sending to ensure only enabled notifications are sent
|
|
19
|
+
*/
|
|
20
|
+
export declare class DeploymentNotifications {
|
|
21
|
+
private baseUrl?;
|
|
22
|
+
constructor(baseUrl?: string);
|
|
23
|
+
/**
|
|
24
|
+
* Send notification when deployment batch starts
|
|
25
|
+
*/
|
|
26
|
+
notifyDeploymentStart(deploymentId: string, solutionName: string, tenantCount: number): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Send notification when deployment batch completes successfully
|
|
29
|
+
*/
|
|
30
|
+
notifyDeploymentComplete(deploymentId: string, solutionName: string, successCount: number, totalCount: number, durationMs: number): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Send notification when deployment batch fails
|
|
33
|
+
*/
|
|
34
|
+
notifyDeploymentFailure(deploymentId: string, solutionName: string, failedCount: number, totalCount: number, errorSummary?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Send notification when deployment requires approval
|
|
37
|
+
*/
|
|
38
|
+
notifyApprovalNeeded(deploymentId: string, solutionName: string, tenantCount: number, reason?: string): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export declare function getDeploymentNotifications(baseUrl?: string): DeploymentNotifications;
|
|
41
|
+
//# sourceMappingURL=deployment-notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-notifications.d.ts","sourceRoot":"","sources":["../../src/services/deployment-notifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,OAAO,CAAC,EAAE,MAAM;IAI5B;;OAEG;IACG,qBAAqB,CACzB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;IACG,wBAAwB,CAC5B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;IACG,uBAAuB,CAC3B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAkChB;;OAEG;IACG,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;CAiCjB;AAKD,wBAAgB,0BAA0B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAQpF"}
|