@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.
Files changed (226) hide show
  1. package/LICENSE +198 -0
  2. package/dist/auth/device-code-login.d.ts +40 -0
  3. package/dist/auth/device-code-login.d.ts.map +1 -0
  4. package/dist/auth/device-code-login.js +59 -0
  5. package/dist/auth/device-code-login.js.map +1 -0
  6. package/dist/auth/gdap-client.d.ts +81 -0
  7. package/dist/auth/gdap-client.d.ts.map +1 -0
  8. package/dist/auth/gdap-client.js +128 -0
  9. package/dist/auth/gdap-client.js.map +1 -0
  10. package/dist/auth/index.d.ts +19 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +19 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/token-manager.d.ts +54 -0
  15. package/dist/auth/token-manager.d.ts.map +1 -0
  16. package/dist/auth/token-manager.js +150 -0
  17. package/dist/auth/token-manager.js.map +1 -0
  18. package/dist/client.d.ts +27 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +27 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/config/client.d.ts +24 -0
  23. package/dist/config/client.d.ts.map +1 -0
  24. package/dist/config/client.js +18 -0
  25. package/dist/config/client.js.map +1 -0
  26. package/dist/config/index.d.ts +18 -0
  27. package/dist/config/index.d.ts.map +1 -0
  28. package/dist/config/index.js +18 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/loader.d.ts +81 -0
  31. package/dist/config/loader.d.ts.map +1 -0
  32. package/dist/config/loader.js +271 -0
  33. package/dist/config/loader.js.map +1 -0
  34. package/dist/config/schema.d.ts +751 -0
  35. package/dist/config/schema.d.ts.map +1 -0
  36. package/dist/config/schema.js +556 -0
  37. package/dist/config/schema.js.map +1 -0
  38. package/dist/constants.d.ts +116 -0
  39. package/dist/constants.d.ts.map +1 -0
  40. package/dist/constants.js +170 -0
  41. package/dist/constants.js.map +1 -0
  42. package/dist/dataverse/agent-resolver.d.ts +98 -0
  43. package/dist/dataverse/agent-resolver.d.ts.map +1 -0
  44. package/dist/dataverse/agent-resolver.js +185 -0
  45. package/dist/dataverse/agent-resolver.js.map +1 -0
  46. package/dist/dataverse/client.d.ts +104 -0
  47. package/dist/dataverse/client.d.ts.map +1 -0
  48. package/dist/dataverse/client.js +272 -0
  49. package/dist/dataverse/client.js.map +1 -0
  50. package/dist/dataverse/connection-refs.d.ts +115 -0
  51. package/dist/dataverse/connection-refs.d.ts.map +1 -0
  52. package/dist/dataverse/connection-refs.js +203 -0
  53. package/dist/dataverse/connection-refs.js.map +1 -0
  54. package/dist/dataverse/index.d.ts +20 -0
  55. package/dist/dataverse/index.d.ts.map +1 -0
  56. package/dist/dataverse/index.js +20 -0
  57. package/dist/dataverse/index.js.map +1 -0
  58. package/dist/dataverse/solution-ops.d.ts +100 -0
  59. package/dist/dataverse/solution-ops.d.ts.map +1 -0
  60. package/dist/dataverse/solution-ops.js +288 -0
  61. package/dist/dataverse/solution-ops.js.map +1 -0
  62. package/dist/errors.d.ts +171 -0
  63. package/dist/errors.d.ts.map +1 -0
  64. package/dist/errors.js +178 -0
  65. package/dist/errors.js.map +1 -0
  66. package/dist/index.d.ts +27 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +40 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/mock/demo-data.d.ts +213 -0
  71. package/dist/mock/demo-data.d.ts.map +1 -0
  72. package/dist/mock/demo-data.js +1096 -0
  73. package/dist/mock/demo-data.js.map +1 -0
  74. package/dist/mock/demo-deployment-store.d.ts +77 -0
  75. package/dist/mock/demo-deployment-store.d.ts.map +1 -0
  76. package/dist/mock/demo-deployment-store.js +85 -0
  77. package/dist/mock/demo-deployment-store.js.map +1 -0
  78. package/dist/powerplatform/admin-client.d.ts +226 -0
  79. package/dist/powerplatform/admin-client.d.ts.map +1 -0
  80. package/dist/powerplatform/admin-client.js +315 -0
  81. package/dist/powerplatform/admin-client.js.map +1 -0
  82. package/dist/powerplatform/index.d.ts +18 -0
  83. package/dist/powerplatform/index.d.ts.map +1 -0
  84. package/dist/powerplatform/index.js +18 -0
  85. package/dist/powerplatform/index.js.map +1 -0
  86. package/dist/powerplatform/tenant-discovery.d.ts +100 -0
  87. package/dist/powerplatform/tenant-discovery.d.ts.map +1 -0
  88. package/dist/powerplatform/tenant-discovery.js +205 -0
  89. package/dist/powerplatform/tenant-discovery.js.map +1 -0
  90. package/dist/preconditions/check.d.ts +41 -0
  91. package/dist/preconditions/check.d.ts.map +1 -0
  92. package/dist/preconditions/check.js +173 -0
  93. package/dist/preconditions/check.js.map +1 -0
  94. package/dist/preconditions/index.d.ts +20 -0
  95. package/dist/preconditions/index.d.ts.map +1 -0
  96. package/dist/preconditions/index.js +20 -0
  97. package/dist/preconditions/index.js.map +1 -0
  98. package/dist/preconditions/loader.d.ts +33 -0
  99. package/dist/preconditions/loader.d.ts.map +1 -0
  100. package/dist/preconditions/loader.js +65 -0
  101. package/dist/preconditions/loader.js.map +1 -0
  102. package/dist/preconditions/schema.d.ts +103 -0
  103. package/dist/preconditions/schema.d.ts.map +1 -0
  104. package/dist/preconditions/schema.js +93 -0
  105. package/dist/preconditions/schema.js.map +1 -0
  106. package/dist/preconditions/types.d.ts +118 -0
  107. package/dist/preconditions/types.d.ts.map +1 -0
  108. package/dist/preconditions/types.js +17 -0
  109. package/dist/preconditions/types.js.map +1 -0
  110. package/dist/queue/index.d.ts +17 -0
  111. package/dist/queue/index.d.ts.map +1 -0
  112. package/dist/queue/index.js +17 -0
  113. package/dist/queue/index.js.map +1 -0
  114. package/dist/queue/memory-queue.d.ts +86 -0
  115. package/dist/queue/memory-queue.d.ts.map +1 -0
  116. package/dist/queue/memory-queue.js +221 -0
  117. package/dist/queue/memory-queue.js.map +1 -0
  118. package/dist/services/audit-log.d.ts +59 -0
  119. package/dist/services/audit-log.d.ts.map +1 -0
  120. package/dist/services/audit-log.js +193 -0
  121. package/dist/services/audit-log.js.map +1 -0
  122. package/dist/services/auth-error-parser.d.ts +36 -0
  123. package/dist/services/auth-error-parser.d.ts.map +1 -0
  124. package/dist/services/auth-error-parser.js +90 -0
  125. package/dist/services/auth-error-parser.js.map +1 -0
  126. package/dist/services/deployment-doctor.d.ts +109 -0
  127. package/dist/services/deployment-doctor.d.ts.map +1 -0
  128. package/dist/services/deployment-doctor.js +476 -0
  129. package/dist/services/deployment-doctor.js.map +1 -0
  130. package/dist/services/deployment-notifications.d.ts +41 -0
  131. package/dist/services/deployment-notifications.d.ts.map +1 -0
  132. package/dist/services/deployment-notifications.js +161 -0
  133. package/dist/services/deployment-notifications.js.map +1 -0
  134. package/dist/services/deployment-progress.d.ts +89 -0
  135. package/dist/services/deployment-progress.d.ts.map +1 -0
  136. package/dist/services/deployment-progress.js +244 -0
  137. package/dist/services/deployment-progress.js.map +1 -0
  138. package/dist/services/deployment-service.d.ts +97 -0
  139. package/dist/services/deployment-service.d.ts.map +1 -0
  140. package/dist/services/deployment-service.js +375 -0
  141. package/dist/services/deployment-service.js.map +1 -0
  142. package/dist/services/drift-analyzer.d.ts +86 -0
  143. package/dist/services/drift-analyzer.d.ts.map +1 -0
  144. package/dist/services/drift-analyzer.js +273 -0
  145. package/dist/services/drift-analyzer.js.map +1 -0
  146. package/dist/services/environment-setup.d.ts +97 -0
  147. package/dist/services/environment-setup.d.ts.map +1 -0
  148. package/dist/services/environment-setup.js +250 -0
  149. package/dist/services/environment-setup.js.map +1 -0
  150. package/dist/services/health-check.d.ts +168 -0
  151. package/dist/services/health-check.d.ts.map +1 -0
  152. package/dist/services/health-check.js +705 -0
  153. package/dist/services/health-check.js.map +1 -0
  154. package/dist/services/index.d.ts +39 -0
  155. package/dist/services/index.d.ts.map +1 -0
  156. package/dist/services/index.js +39 -0
  157. package/dist/services/index.js.map +1 -0
  158. package/dist/services/logger.d.ts +139 -0
  159. package/dist/services/logger.d.ts.map +1 -0
  160. package/dist/services/logger.js +268 -0
  161. package/dist/services/logger.js.map +1 -0
  162. package/dist/services/notification-service.d.ts +55 -0
  163. package/dist/services/notification-service.d.ts.map +1 -0
  164. package/dist/services/notification-service.js +184 -0
  165. package/dist/services/notification-service.js.map +1 -0
  166. package/dist/services/risk-analyzer.d.ts +252 -0
  167. package/dist/services/risk-analyzer.d.ts.map +1 -0
  168. package/dist/services/risk-analyzer.js +866 -0
  169. package/dist/services/risk-analyzer.js.map +1 -0
  170. package/dist/services/rollback.d.ts +57 -0
  171. package/dist/services/rollback.d.ts.map +1 -0
  172. package/dist/services/rollback.js +270 -0
  173. package/dist/services/rollback.js.map +1 -0
  174. package/dist/services/scheduler.d.ts +80 -0
  175. package/dist/services/scheduler.d.ts.map +1 -0
  176. package/dist/services/scheduler.js +350 -0
  177. package/dist/services/scheduler.js.map +1 -0
  178. package/dist/services/secrets.d.ts +31 -0
  179. package/dist/services/secrets.d.ts.map +1 -0
  180. package/dist/services/secrets.js +206 -0
  181. package/dist/services/secrets.js.map +1 -0
  182. package/dist/services/settings-service.d.ts +132 -0
  183. package/dist/services/settings-service.d.ts.map +1 -0
  184. package/dist/services/settings-service.js +378 -0
  185. package/dist/services/settings-service.js.map +1 -0
  186. package/dist/services/solution-diff.d.ts +127 -0
  187. package/dist/services/solution-diff.d.ts.map +1 -0
  188. package/dist/services/solution-diff.js +260 -0
  189. package/dist/services/solution-diff.js.map +1 -0
  190. package/dist/services/solution-mode-detector.d.ts +35 -0
  191. package/dist/services/solution-mode-detector.d.ts.map +1 -0
  192. package/dist/services/solution-mode-detector.js +84 -0
  193. package/dist/services/solution-mode-detector.js.map +1 -0
  194. package/dist/services/tenant-resolver.d.ts +55 -0
  195. package/dist/services/tenant-resolver.d.ts.map +1 -0
  196. package/dist/services/tenant-resolver.js +126 -0
  197. package/dist/services/tenant-resolver.js.map +1 -0
  198. package/dist/services/unmanaged-customizations.d.ts +104 -0
  199. package/dist/services/unmanaged-customizations.d.ts.map +1 -0
  200. package/dist/services/unmanaged-customizations.js +521 -0
  201. package/dist/services/unmanaged-customizations.js.map +1 -0
  202. package/dist/services/url-templater.d.ts +184 -0
  203. package/dist/services/url-templater.d.ts.map +1 -0
  204. package/dist/services/url-templater.js +327 -0
  205. package/dist/services/url-templater.js.map +1 -0
  206. package/dist/services/version-checker.d.ts +108 -0
  207. package/dist/services/version-checker.d.ts.map +1 -0
  208. package/dist/services/version-checker.js +403 -0
  209. package/dist/services/version-checker.js.map +1 -0
  210. package/dist/services/waves.d.ts +90 -0
  211. package/dist/services/waves.d.ts.map +1 -0
  212. package/dist/services/waves.js +222 -0
  213. package/dist/services/waves.js.map +1 -0
  214. package/dist/services/webhook.d.ts +95 -0
  215. package/dist/services/webhook.d.ts.map +1 -0
  216. package/dist/services/webhook.js +244 -0
  217. package/dist/services/webhook.js.map +1 -0
  218. package/dist/utils/deployment-tools.d.ts +110 -0
  219. package/dist/utils/deployment-tools.d.ts.map +1 -0
  220. package/dist/utils/deployment-tools.js +121 -0
  221. package/dist/utils/deployment-tools.js.map +1 -0
  222. package/dist/utils/index.d.ts +17 -0
  223. package/dist/utils/index.d.ts.map +1 -0
  224. package/dist/utils/index.js +18 -0
  225. package/dist/utils/index.js.map +1 -0
  226. package/package.json +49 -0
@@ -0,0 +1,132 @@
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
+ * Integration settings for Power Platform / Dynamics connection
18
+ */
19
+ export interface IntegrationSettings {
20
+ partnerTenantId?: string;
21
+ partnerClientId?: string;
22
+ partnerClientSecret?: string;
23
+ sourceTenantId?: string;
24
+ sourceEnvironmentUrl?: string;
25
+ tenantDiscoveryEnabled?: boolean;
26
+ connectionMappingEnabled?: boolean;
27
+ environmentVariablesEnabled?: boolean;
28
+ configuredAt?: string;
29
+ configuredBy?: string;
30
+ lastTestedAt?: string;
31
+ lastTestResult?: "success" | "failed";
32
+ lastTestError?: string;
33
+ }
34
+ /**
35
+ * General application settings
36
+ */
37
+ export interface AppSettings {
38
+ demoMode: boolean;
39
+ slackEnabled?: boolean;
40
+ slackWebhookUrl?: string;
41
+ teamsEnabled?: boolean;
42
+ teamsWebhookUrl?: string;
43
+ emailEnabled?: boolean;
44
+ emailRecipients?: string;
45
+ notifyOnDeploymentStart?: boolean;
46
+ notifyOnDeploymentComplete?: boolean;
47
+ notifyOnDeploymentFailure?: boolean;
48
+ notifyOnApprovalNeeded?: boolean;
49
+ defaultMaxConcurrentDeployments?: number;
50
+ defaultDeploymentTimeoutMs?: number;
51
+ autoRetryFailedDeployments?: boolean;
52
+ theme?: "light" | "dark" | "system";
53
+ dateFormat?: string;
54
+ timezone?: string;
55
+ }
56
+ export interface AllSettings {
57
+ integration: IntegrationSettings;
58
+ app: AppSettings;
59
+ }
60
+ /**
61
+ * Settings service for managing application configuration
62
+ * Supports both file-based storage (demo) and encrypted database storage (production)
63
+ */
64
+ export declare class SettingsService {
65
+ private encryptionKey;
66
+ private settingsDir;
67
+ private encryptionSecretPath;
68
+ private settingsFilePath;
69
+ private cachedSettings;
70
+ constructor(options?: {
71
+ settingsDir?: string;
72
+ encryptionSecret?: string;
73
+ });
74
+ /**
75
+ * Get all settings
76
+ */
77
+ getSettings(): Promise<AllSettings>;
78
+ /**
79
+ * Get integration settings
80
+ */
81
+ getIntegrationSettings(): Promise<IntegrationSettings>;
82
+ /**
83
+ * Get app settings
84
+ */
85
+ getAppSettings(): Promise<AppSettings>;
86
+ /**
87
+ * Update integration settings
88
+ */
89
+ updateIntegrationSettings(updates: Partial<IntegrationSettings>, configuredBy?: string): Promise<IntegrationSettings>;
90
+ /**
91
+ * Update app settings
92
+ */
93
+ updateAppSettings(updates: Partial<AppSettings>): Promise<AppSettings>;
94
+ /**
95
+ * Get decrypted integration settings (for API use)
96
+ */
97
+ getDecryptedIntegrationSettings(): Promise<IntegrationSettings>;
98
+ /**
99
+ * Get decrypted app settings (for API use)
100
+ */
101
+ getDecryptedAppSettings(): Promise<AppSettings>;
102
+ private getDecryptedIntegrationSettingsInternal;
103
+ private getDecryptedAppSettingsInternal;
104
+ /**
105
+ * Check if integration is configured
106
+ */
107
+ isIntegrationConfigured(): Promise<boolean>;
108
+ /**
109
+ * Clear all settings (for testing or reset)
110
+ */
111
+ clearSettings(): Promise<void>;
112
+ /**
113
+ * Record a connection test result
114
+ */
115
+ recordTestResult(success: boolean, error?: string): Promise<void>;
116
+ private loadFromFile;
117
+ private saveToFile;
118
+ private getDefaultSettings;
119
+ private getOrCreateSalt;
120
+ private getPersistedEncryptionSecret;
121
+ private getOrCreateEncryptionSecret;
122
+ private ensureEncryptionKeyForSensitiveWrites;
123
+ private encrypt;
124
+ private decrypt;
125
+ }
126
+ export declare function getSettingsService(): SettingsService;
127
+ /**
128
+ * Helper to get effective integration settings
129
+ * Prefers database settings, falls back to environment variables
130
+ */
131
+ export declare function getEffectiveIntegrationSettings(): Promise<IntegrationSettings>;
132
+ //# sourceMappingURL=settings-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-service.d.ts","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,378 @@
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
+ import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from "crypto";
17
+ import { readFileSync, writeFileSync, existsSync, chmodSync } from "fs";
18
+ import { join } from "path";
19
+ import { coreLogger } from "./logger.js";
20
+ const logger = coreLogger.child({ service: "settings" });
21
+ const ENCRYPTION_ALGORITHM = "aes-256-gcm";
22
+ const IV_LENGTH = 16;
23
+ const SALT_LENGTH = 32;
24
+ /**
25
+ * Settings service for managing application configuration
26
+ * Supports both file-based storage (demo) and encrypted database storage (production)
27
+ */
28
+ export class SettingsService {
29
+ encryptionKey = null;
30
+ settingsDir;
31
+ encryptionSecretPath;
32
+ settingsFilePath;
33
+ cachedSettings = null;
34
+ constructor(options) {
35
+ this.settingsDir = options?.settingsDir || process.cwd();
36
+ this.encryptionSecretPath = join(this.settingsDir, ".pax8-cta-encryption-key");
37
+ this.settingsFilePath = join(this.settingsDir, ".pax8-cta-settings.json");
38
+ // Derive encryption key from secret
39
+ const secret = options?.encryptionSecret ||
40
+ process.env.SETTINGS_ENCRYPTION_SECRET ||
41
+ this.getPersistedEncryptionSecret();
42
+ if (secret) {
43
+ // Use scrypt to derive a proper key from the secret
44
+ const salt = this.getOrCreateSalt(this.settingsDir);
45
+ this.encryptionKey = scryptSync(secret, salt, 32);
46
+ }
47
+ }
48
+ /**
49
+ * Get all settings
50
+ */
51
+ async getSettings() {
52
+ if (this.cachedSettings) {
53
+ return this.cachedSettings;
54
+ }
55
+ const settings = this.loadFromFile();
56
+ this.cachedSettings = settings;
57
+ return settings;
58
+ }
59
+ /**
60
+ * Get integration settings
61
+ */
62
+ async getIntegrationSettings() {
63
+ const settings = await this.getSettings();
64
+ return settings.integration;
65
+ }
66
+ /**
67
+ * Get app settings
68
+ */
69
+ async getAppSettings() {
70
+ const settings = await this.getSettings();
71
+ return settings.app;
72
+ }
73
+ /**
74
+ * Update integration settings
75
+ */
76
+ async updateIntegrationSettings(updates, configuredBy) {
77
+ const settings = await this.getSettings();
78
+ // Sensitive fields must always be encrypted at rest.
79
+ if (updates.partnerClientSecret) {
80
+ this.ensureEncryptionKeyForSensitiveWrites();
81
+ updates.partnerClientSecret = this.encrypt(updates.partnerClientSecret);
82
+ }
83
+ settings.integration = {
84
+ ...settings.integration,
85
+ ...updates,
86
+ configuredAt: new Date().toISOString(),
87
+ configuredBy: configuredBy || settings.integration.configuredBy,
88
+ };
89
+ this.saveToFile(settings);
90
+ this.cachedSettings = settings;
91
+ logger.info("Integration settings updated", {
92
+ configuredBy,
93
+ hasPartnerCredentials: !!settings.integration.partnerTenantId,
94
+ hasSourceEnvironment: !!settings.integration.sourceEnvironmentUrl,
95
+ });
96
+ return this.getDecryptedIntegrationSettingsInternal(settings.integration);
97
+ }
98
+ /**
99
+ * Update app settings
100
+ */
101
+ async updateAppSettings(updates) {
102
+ const settings = await this.getSettings();
103
+ if (updates.slackWebhookUrl || updates.teamsWebhookUrl) {
104
+ this.ensureEncryptionKeyForSensitiveWrites();
105
+ }
106
+ // Encrypt webhook URLs if provided
107
+ if (updates.slackWebhookUrl) {
108
+ updates.slackWebhookUrl = this.encrypt(updates.slackWebhookUrl);
109
+ }
110
+ if (updates.teamsWebhookUrl) {
111
+ updates.teamsWebhookUrl = this.encrypt(updates.teamsWebhookUrl);
112
+ }
113
+ settings.app = {
114
+ ...settings.app,
115
+ ...updates,
116
+ };
117
+ this.saveToFile(settings);
118
+ this.cachedSettings = settings;
119
+ logger.info("App settings updated", {
120
+ demoMode: settings.app.demoMode,
121
+ slackEnabled: settings.app.slackEnabled,
122
+ teamsEnabled: settings.app.teamsEnabled,
123
+ emailEnabled: settings.app.emailEnabled,
124
+ });
125
+ return settings.app;
126
+ }
127
+ /**
128
+ * Get decrypted integration settings (for API use)
129
+ */
130
+ async getDecryptedIntegrationSettings() {
131
+ const settings = await this.getSettings();
132
+ return this.getDecryptedIntegrationSettingsInternal(settings.integration);
133
+ }
134
+ /**
135
+ * Get decrypted app settings (for API use)
136
+ */
137
+ async getDecryptedAppSettings() {
138
+ const settings = await this.getSettings();
139
+ return this.getDecryptedAppSettingsInternal(settings.app);
140
+ }
141
+ getDecryptedIntegrationSettingsInternal(settings) {
142
+ const result = { ...settings };
143
+ // Decrypt secret if encrypted
144
+ if (result.partnerClientSecret && this.encryptionKey) {
145
+ try {
146
+ result.partnerClientSecret = this.decrypt(result.partnerClientSecret);
147
+ }
148
+ catch {
149
+ // If decryption fails, it might not be encrypted yet
150
+ logger.warn("Failed to decrypt client secret - may not be encrypted");
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ getDecryptedAppSettingsInternal(settings) {
156
+ const result = { ...settings };
157
+ // Decrypt webhook URLs if encrypted
158
+ if (result.slackWebhookUrl && this.encryptionKey) {
159
+ try {
160
+ result.slackWebhookUrl = this.decrypt(result.slackWebhookUrl);
161
+ }
162
+ catch {
163
+ logger.warn("Failed to decrypt Slack webhook - may not be encrypted");
164
+ }
165
+ }
166
+ if (result.teamsWebhookUrl && this.encryptionKey) {
167
+ try {
168
+ result.teamsWebhookUrl = this.decrypt(result.teamsWebhookUrl);
169
+ }
170
+ catch {
171
+ logger.warn("Failed to decrypt Teams webhook - may not be encrypted");
172
+ }
173
+ }
174
+ return result;
175
+ }
176
+ /**
177
+ * Check if integration is configured
178
+ */
179
+ async isIntegrationConfigured() {
180
+ const settings = await this.getIntegrationSettings();
181
+ return !!(settings.partnerTenantId && settings.partnerClientId && settings.partnerClientSecret);
182
+ }
183
+ /**
184
+ * Clear all settings (for testing or reset)
185
+ */
186
+ async clearSettings() {
187
+ this.cachedSettings = null;
188
+ if (existsSync(this.settingsFilePath)) {
189
+ writeFileSync(this.settingsFilePath, JSON.stringify(this.getDefaultSettings(), null, 2));
190
+ }
191
+ logger.info("Settings cleared");
192
+ }
193
+ /**
194
+ * Record a connection test result
195
+ */
196
+ async recordTestResult(success, error) {
197
+ const settings = await this.getSettings();
198
+ settings.integration.lastTestedAt = new Date().toISOString();
199
+ settings.integration.lastTestResult = success ? "success" : "failed";
200
+ settings.integration.lastTestError = error;
201
+ this.saveToFile(settings);
202
+ this.cachedSettings = settings;
203
+ }
204
+ // Private methods
205
+ loadFromFile() {
206
+ try {
207
+ if (existsSync(this.settingsFilePath)) {
208
+ const data = readFileSync(this.settingsFilePath, "utf-8");
209
+ const parsed = JSON.parse(data);
210
+ return {
211
+ ...this.getDefaultSettings(),
212
+ ...parsed,
213
+ integration: {
214
+ ...this.getDefaultSettings().integration,
215
+ ...parsed.integration,
216
+ },
217
+ app: {
218
+ ...this.getDefaultSettings().app,
219
+ ...parsed.app,
220
+ },
221
+ };
222
+ }
223
+ }
224
+ catch (error) {
225
+ logger.warn("Failed to load settings from file", { error });
226
+ }
227
+ return this.getDefaultSettings();
228
+ }
229
+ saveToFile(settings) {
230
+ try {
231
+ writeFileSync(this.settingsFilePath, JSON.stringify(settings, null, 2));
232
+ }
233
+ catch (error) {
234
+ logger.error("Failed to save settings to file", error);
235
+ throw error;
236
+ }
237
+ }
238
+ getDefaultSettings() {
239
+ return {
240
+ integration: {
241
+ tenantDiscoveryEnabled: false,
242
+ connectionMappingEnabled: false,
243
+ environmentVariablesEnabled: false,
244
+ },
245
+ app: {
246
+ demoMode: process.env.DEMO_MODE !== "false",
247
+ defaultMaxConcurrentDeployments: 3,
248
+ defaultDeploymentTimeoutMs: 600000,
249
+ autoRetryFailedDeployments: false,
250
+ theme: "system",
251
+ },
252
+ };
253
+ }
254
+ getOrCreateSalt(settingsDir) {
255
+ const saltPath = join(settingsDir, ".pax8-cta-salt");
256
+ try {
257
+ if (existsSync(saltPath)) {
258
+ return Buffer.from(readFileSync(saltPath, "utf-8"), "hex");
259
+ }
260
+ }
261
+ catch {
262
+ // Salt file doesn't exist or is invalid
263
+ }
264
+ // Generate new salt
265
+ const salt = randomBytes(SALT_LENGTH);
266
+ try {
267
+ writeFileSync(saltPath, salt.toString("hex"));
268
+ }
269
+ catch {
270
+ logger.warn("Failed to save encryption salt - using ephemeral salt");
271
+ }
272
+ return salt;
273
+ }
274
+ getPersistedEncryptionSecret() {
275
+ try {
276
+ if (existsSync(this.encryptionSecretPath)) {
277
+ const secret = readFileSync(this.encryptionSecretPath, "utf-8").trim();
278
+ if (secret) {
279
+ return secret;
280
+ }
281
+ }
282
+ }
283
+ catch {
284
+ logger.warn("Failed to load persisted encryption secret");
285
+ }
286
+ return undefined;
287
+ }
288
+ getOrCreateEncryptionSecret() {
289
+ const persisted = this.getPersistedEncryptionSecret();
290
+ if (persisted) {
291
+ return persisted;
292
+ }
293
+ const secret = randomBytes(32).toString("hex");
294
+ try {
295
+ writeFileSync(this.encryptionSecretPath, secret, { mode: 0o600 });
296
+ if (process.platform !== "win32") {
297
+ chmodSync(this.encryptionSecretPath, 0o600);
298
+ }
299
+ return secret;
300
+ }
301
+ catch {
302
+ logger.error("Failed to persist encryption secret for settings");
303
+ return undefined;
304
+ }
305
+ }
306
+ ensureEncryptionKeyForSensitiveWrites() {
307
+ if (this.encryptionKey) {
308
+ return;
309
+ }
310
+ const secret = this.getOrCreateEncryptionSecret();
311
+ if (!secret) {
312
+ throw new Error(`Cannot store sensitive settings without encryption. Set SETTINGS_ENCRYPTION_SECRET or ensure write access to ${this.encryptionSecretPath}`);
313
+ }
314
+ const salt = this.getOrCreateSalt(this.settingsDir);
315
+ this.encryptionKey = scryptSync(secret, salt, 32);
316
+ }
317
+ encrypt(text) {
318
+ if (!this.encryptionKey) {
319
+ return text; // No encryption if no key
320
+ }
321
+ const iv = randomBytes(IV_LENGTH);
322
+ const cipher = createCipheriv(ENCRYPTION_ALGORITHM, this.encryptionKey, iv);
323
+ let encrypted = cipher.update(text, "utf8", "hex");
324
+ encrypted += cipher.final("hex");
325
+ const authTag = cipher.getAuthTag();
326
+ // Format: iv:authTag:encrypted
327
+ return `${iv.toString("hex")}:${authTag.toString("hex")}:${encrypted}`;
328
+ }
329
+ decrypt(encryptedText) {
330
+ if (!this.encryptionKey) {
331
+ return encryptedText; // No decryption if no key
332
+ }
333
+ const parts = encryptedText.split(":");
334
+ if (parts.length !== 3) {
335
+ // Not encrypted or invalid format
336
+ return encryptedText;
337
+ }
338
+ const [ivHex, authTagHex, encrypted] = parts;
339
+ const iv = Buffer.from(ivHex, "hex");
340
+ const authTag = Buffer.from(authTagHex, "hex");
341
+ const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, this.encryptionKey, iv);
342
+ decipher.setAuthTag(authTag);
343
+ let decrypted = decipher.update(encrypted, "hex", "utf8");
344
+ decrypted += decipher.final("utf8");
345
+ return decrypted;
346
+ }
347
+ }
348
+ // Singleton instance
349
+ let settingsInstance = null;
350
+ export function getSettingsService() {
351
+ if (!settingsInstance) {
352
+ settingsInstance = new SettingsService();
353
+ }
354
+ return settingsInstance;
355
+ }
356
+ /**
357
+ * Helper to get effective integration settings
358
+ * Prefers database settings, falls back to environment variables
359
+ */
360
+ export async function getEffectiveIntegrationSettings() {
361
+ const settingsService = getSettingsService();
362
+ const dbSettings = await settingsService.getDecryptedIntegrationSettings();
363
+ return {
364
+ partnerTenantId: dbSettings.partnerTenantId || process.env.PARTNER_TENANT_ID,
365
+ partnerClientId: dbSettings.partnerClientId || process.env.PARTNER_CLIENT_ID,
366
+ partnerClientSecret: dbSettings.partnerClientSecret || process.env.PARTNER_CLIENT_SECRET,
367
+ sourceTenantId: dbSettings.sourceTenantId || process.env.SOURCE_TENANT_ID,
368
+ sourceEnvironmentUrl: dbSettings.sourceEnvironmentUrl || process.env.SOURCE_ENVIRONMENT_URL,
369
+ tenantDiscoveryEnabled: dbSettings.tenantDiscoveryEnabled ?? process.env.TENANT_DISCOVERY_ENABLED === "true",
370
+ connectionMappingEnabled: dbSettings.connectionMappingEnabled ?? process.env.CONNECTION_MAPPING_ENABLED === "true",
371
+ environmentVariablesEnabled: dbSettings.environmentVariablesEnabled ?? process.env.ENV_VARIABLES_ENABLED === "true",
372
+ configuredAt: dbSettings.configuredAt,
373
+ lastTestedAt: dbSettings.lastTestedAt,
374
+ lastTestResult: dbSettings.lastTestResult,
375
+ lastTestError: dbSettings.lastTestError,
376
+ };
377
+ }
378
+ //# sourceMappingURL=settings-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
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
+ import { DataverseClient } from "../dataverse/index.js";
17
+ /**
18
+ * Component type codes in Power Platform
19
+ */
20
+ export declare const ComponentTypes: Record<number, string>;
21
+ /**
22
+ * Solution component record
23
+ */
24
+ export interface SolutionComponentRecord {
25
+ solutioncomponentid: string;
26
+ componenttype: number;
27
+ objectid: string;
28
+ rootsolutioncomponentid: string | null;
29
+ ismetadata: boolean;
30
+ }
31
+ /**
32
+ * Component difference
33
+ */
34
+ export interface ComponentDiff {
35
+ type: "added" | "removed" | "modified";
36
+ componentType: number;
37
+ componentTypeName: string;
38
+ objectId: string;
39
+ name?: string;
40
+ }
41
+ /**
42
+ * Solution comparison result
43
+ */
44
+ export interface SolutionComparisonResult {
45
+ source: {
46
+ uniqueName: string;
47
+ version: string;
48
+ componentCount: number;
49
+ };
50
+ target: {
51
+ uniqueName: string;
52
+ version: string;
53
+ componentCount: number;
54
+ } | null;
55
+ summary: {
56
+ added: number;
57
+ removed: number;
58
+ modified: number;
59
+ unchanged: number;
60
+ };
61
+ differences: ComponentDiff[];
62
+ isUpgrade: boolean;
63
+ isNewInstall: boolean;
64
+ }
65
+ /**
66
+ * Service for comparing solutions and previewing changes
67
+ */
68
+ export declare class SolutionDiffService {
69
+ /**
70
+ * Compare a solution file against what's installed in a target environment
71
+ */
72
+ compareSolutions(solutionPath: string, targetClient: DataverseClient): Promise<SolutionComparisonResult>;
73
+ /**
74
+ * Get all components from a solution
75
+ */
76
+ getSolutionComponents(client: DataverseClient, solutionId: string): Promise<SolutionComponentRecord[]>;
77
+ /**
78
+ * Parse solution.xml from a solution zip file
79
+ */
80
+ parseSolutionFile(solutionPath: string): Promise<{
81
+ uniqueName: string;
82
+ version: string;
83
+ friendlyName: string;
84
+ isManaged: boolean;
85
+ componentCount?: number;
86
+ } | null>;
87
+ /**
88
+ * Compare two version strings
89
+ * Returns: >0 if v1 > v2, <0 if v1 < v2, 0 if equal
90
+ */
91
+ compareVersions(v1: string, v2: string): number;
92
+ /**
93
+ * Preview what will happen during deployment
94
+ */
95
+ previewDeployment(solutionPath: string, targetClient: DataverseClient): Promise<{
96
+ willInstall: boolean;
97
+ willUpgrade: boolean;
98
+ sourceVersion: string;
99
+ targetVersion: string | null;
100
+ warnings: string[];
101
+ estimatedDurationMs: number;
102
+ }>;
103
+ /**
104
+ * Calculate checksum for a solution file
105
+ */
106
+ calculateChecksum(solutionPath: string): Promise<string>;
107
+ /**
108
+ * Verify solution file integrity
109
+ */
110
+ verifySolutionIntegrity(solutionPath: string, expectedChecksum?: string): Promise<{
111
+ valid: boolean;
112
+ checksum: string;
113
+ errors: string[];
114
+ }>;
115
+ /**
116
+ * Get summary of solution contents (for display purposes)
117
+ */
118
+ getSolutionSummary(solutionPath: string): Promise<{
119
+ uniqueName: string;
120
+ version: string;
121
+ friendlyName: string;
122
+ isManaged: boolean;
123
+ checksum: string;
124
+ fileSizeBytes: number;
125
+ } | null>;
126
+ }
127
+ //# sourceMappingURL=solution-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solution-diff.d.ts","sourceRoot":"","sources":["../../src/services/solution-diff.ts"],"names":[],"mappings":"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"}