pax8-cta 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 (224) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +659 -0
  3. package/demo-data/solutions/ProductQADemo_1_0_0_2_managed.zip +0 -0
  4. package/dist/commands/analyze.d.ts +28 -0
  5. package/dist/commands/analyze.d.ts.map +1 -0
  6. package/dist/commands/analyze.js +571 -0
  7. package/dist/commands/analyze.js.map +1 -0
  8. package/dist/commands/auth.d.ts +18 -0
  9. package/dist/commands/auth.d.ts.map +1 -0
  10. package/dist/commands/auth.js +171 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/commands/config.d.ts +34 -0
  13. package/dist/commands/config.d.ts.map +1 -0
  14. package/dist/commands/config.js +299 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/demo.d.ts +33 -0
  17. package/dist/commands/demo.d.ts.map +1 -0
  18. package/dist/commands/demo.js +362 -0
  19. package/dist/commands/demo.js.map +1 -0
  20. package/dist/commands/deploy.d.ts +18 -0
  21. package/dist/commands/deploy.d.ts.map +1 -0
  22. package/dist/commands/deploy.js +1186 -0
  23. package/dist/commands/deploy.js.map +1 -0
  24. package/dist/commands/deployments/helpers.d.ts +68 -0
  25. package/dist/commands/deployments/helpers.d.ts.map +1 -0
  26. package/dist/commands/deployments/helpers.js +414 -0
  27. package/dist/commands/deployments/helpers.js.map +1 -0
  28. package/dist/commands/deployments/index.d.ts +24 -0
  29. package/dist/commands/deployments/index.d.ts.map +1 -0
  30. package/dist/commands/deployments/index.js +47 -0
  31. package/dist/commands/deployments/index.js.map +1 -0
  32. package/dist/commands/deployments/list.d.ts +18 -0
  33. package/dist/commands/deployments/list.d.ts.map +1 -0
  34. package/dist/commands/deployments/list.js +97 -0
  35. package/dist/commands/deployments/list.js.map +1 -0
  36. package/dist/commands/deployments/show.d.ts +18 -0
  37. package/dist/commands/deployments/show.d.ts.map +1 -0
  38. package/dist/commands/deployments/show.js +81 -0
  39. package/dist/commands/deployments/show.js.map +1 -0
  40. package/dist/commands/deployments/undo.d.ts +18 -0
  41. package/dist/commands/deployments/undo.d.ts.map +1 -0
  42. package/dist/commands/deployments/undo.js +295 -0
  43. package/dist/commands/deployments/undo.js.map +1 -0
  44. package/dist/commands/export.d.ts +18 -0
  45. package/dist/commands/export.d.ts.map +1 -0
  46. package/dist/commands/export.js +133 -0
  47. package/dist/commands/export.js.map +1 -0
  48. package/dist/commands/import.d.ts +18 -0
  49. package/dist/commands/import.d.ts.map +1 -0
  50. package/dist/commands/import.js +129 -0
  51. package/dist/commands/import.js.map +1 -0
  52. package/dist/commands/init-config.d.ts +26 -0
  53. package/dist/commands/init-config.d.ts.map +1 -0
  54. package/dist/commands/init-config.js +123 -0
  55. package/dist/commands/init-config.js.map +1 -0
  56. package/dist/commands/init-validation.d.ts +47 -0
  57. package/dist/commands/init-validation.d.ts.map +1 -0
  58. package/dist/commands/init-validation.js +339 -0
  59. package/dist/commands/init-validation.js.map +1 -0
  60. package/dist/commands/init-wizard.d.ts +25 -0
  61. package/dist/commands/init-wizard.d.ts.map +1 -0
  62. package/dist/commands/init-wizard.js +433 -0
  63. package/dist/commands/init-wizard.js.map +1 -0
  64. package/dist/commands/init.d.ts +18 -0
  65. package/dist/commands/init.d.ts.map +1 -0
  66. package/dist/commands/init.js +46 -0
  67. package/dist/commands/init.js.map +1 -0
  68. package/dist/commands/resolve-url.d.ts +18 -0
  69. package/dist/commands/resolve-url.d.ts.map +1 -0
  70. package/dist/commands/resolve-url.js +126 -0
  71. package/dist/commands/resolve-url.js.map +1 -0
  72. package/dist/commands/setup.d.ts +18 -0
  73. package/dist/commands/setup.d.ts.map +1 -0
  74. package/dist/commands/setup.js +239 -0
  75. package/dist/commands/setup.js.map +1 -0
  76. package/dist/commands/solutions/drift-analysis.d.ts +73 -0
  77. package/dist/commands/solutions/drift-analysis.d.ts.map +1 -0
  78. package/dist/commands/solutions/drift-analysis.js +416 -0
  79. package/dist/commands/solutions/drift-analysis.js.map +1 -0
  80. package/dist/commands/solutions/drift.d.ts +32 -0
  81. package/dist/commands/solutions/drift.d.ts.map +1 -0
  82. package/dist/commands/solutions/drift.js +641 -0
  83. package/dist/commands/solutions/drift.js.map +1 -0
  84. package/dist/commands/solutions/fix-planner.d.ts +48 -0
  85. package/dist/commands/solutions/fix-planner.d.ts.map +1 -0
  86. package/dist/commands/solutions/fix-planner.js +43 -0
  87. package/dist/commands/solutions/fix-planner.js.map +1 -0
  88. package/dist/commands/solutions/helpers.d.ts +35 -0
  89. package/dist/commands/solutions/helpers.d.ts.map +1 -0
  90. package/dist/commands/solutions/helpers.js +54 -0
  91. package/dist/commands/solutions/helpers.js.map +1 -0
  92. package/dist/commands/solutions/index.d.ts +18 -0
  93. package/dist/commands/solutions/index.d.ts.map +1 -0
  94. package/dist/commands/solutions/index.js +30 -0
  95. package/dist/commands/solutions/index.js.map +1 -0
  96. package/dist/commands/solutions/list.d.ts +18 -0
  97. package/dist/commands/solutions/list.d.ts.map +1 -0
  98. package/dist/commands/solutions/list.js +174 -0
  99. package/dist/commands/solutions/list.js.map +1 -0
  100. package/dist/commands/solutions/remove.d.ts +18 -0
  101. package/dist/commands/solutions/remove.d.ts.map +1 -0
  102. package/dist/commands/solutions/remove.js +137 -0
  103. package/dist/commands/solutions/remove.js.map +1 -0
  104. package/dist/commands/solutions/risk-calculator.d.ts +33 -0
  105. package/dist/commands/solutions/risk-calculator.d.ts.map +1 -0
  106. package/dist/commands/solutions/risk-calculator.js +79 -0
  107. package/dist/commands/solutions/risk-calculator.js.map +1 -0
  108. package/dist/commands/solutions/show.d.ts +18 -0
  109. package/dist/commands/solutions/show.d.ts.map +1 -0
  110. package/dist/commands/solutions/show.js +165 -0
  111. package/dist/commands/solutions/show.js.map +1 -0
  112. package/dist/commands/status.d.ts +18 -0
  113. package/dist/commands/status.d.ts.map +1 -0
  114. package/dist/commands/status.js +573 -0
  115. package/dist/commands/status.js.map +1 -0
  116. package/dist/commands/telemetry.d.ts +18 -0
  117. package/dist/commands/telemetry.d.ts.map +1 -0
  118. package/dist/commands/telemetry.js +85 -0
  119. package/dist/commands/telemetry.js.map +1 -0
  120. package/dist/commands/tenants/health.d.ts +18 -0
  121. package/dist/commands/tenants/health.d.ts.map +1 -0
  122. package/dist/commands/tenants/health.js +172 -0
  123. package/dist/commands/tenants/health.js.map +1 -0
  124. package/dist/commands/tenants/helpers.d.ts +44 -0
  125. package/dist/commands/tenants/helpers.d.ts.map +1 -0
  126. package/dist/commands/tenants/helpers.js +72 -0
  127. package/dist/commands/tenants/helpers.js.map +1 -0
  128. package/dist/commands/tenants/index.d.ts +19 -0
  129. package/dist/commands/tenants/index.d.ts.map +1 -0
  130. package/dist/commands/tenants/index.js +39 -0
  131. package/dist/commands/tenants/index.js.map +1 -0
  132. package/dist/commands/tenants/inspect.d.ts +18 -0
  133. package/dist/commands/tenants/inspect.d.ts.map +1 -0
  134. package/dist/commands/tenants/inspect.js +176 -0
  135. package/dist/commands/tenants/inspect.js.map +1 -0
  136. package/dist/commands/tenants/list.d.ts +18 -0
  137. package/dist/commands/tenants/list.d.ts.map +1 -0
  138. package/dist/commands/tenants/list.js +144 -0
  139. package/dist/commands/tenants/list.js.map +1 -0
  140. package/dist/commands/tenants/manage.d.ts +20 -0
  141. package/dist/commands/tenants/manage.d.ts.map +1 -0
  142. package/dist/commands/tenants/manage.js +206 -0
  143. package/dist/commands/tenants/manage.js.map +1 -0
  144. package/dist/commands/tenants/show.d.ts +18 -0
  145. package/dist/commands/tenants/show.d.ts.map +1 -0
  146. package/dist/commands/tenants/show.js +191 -0
  147. package/dist/commands/tenants/show.js.map +1 -0
  148. package/dist/commands/validate.d.ts +18 -0
  149. package/dist/commands/validate.d.ts.map +1 -0
  150. package/dist/commands/validate.js +536 -0
  151. package/dist/commands/validate.js.map +1 -0
  152. package/dist/index.d.ts +19 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +258 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/auth.d.ts +51 -0
  157. package/dist/lib/auth.d.ts.map +1 -0
  158. package/dist/lib/auth.js +153 -0
  159. package/dist/lib/auth.js.map +1 -0
  160. package/dist/lib/banner.d.ts +19 -0
  161. package/dist/lib/banner.d.ts.map +1 -0
  162. package/dist/lib/banner.js +78 -0
  163. package/dist/lib/banner.js.map +1 -0
  164. package/dist/lib/command-wrapper.d.ts +56 -0
  165. package/dist/lib/command-wrapper.d.ts.map +1 -0
  166. package/dist/lib/command-wrapper.js +71 -0
  167. package/dist/lib/command-wrapper.js.map +1 -0
  168. package/dist/lib/credentials.d.ts +56 -0
  169. package/dist/lib/credentials.d.ts.map +1 -0
  170. package/dist/lib/credentials.js +146 -0
  171. package/dist/lib/credentials.js.map +1 -0
  172. package/dist/lib/demo-banner.d.ts +15 -0
  173. package/dist/lib/demo-banner.d.ts.map +1 -0
  174. package/dist/lib/demo-banner.js +33 -0
  175. package/dist/lib/demo-banner.js.map +1 -0
  176. package/dist/lib/error-handler.d.ts +51 -0
  177. package/dist/lib/error-handler.d.ts.map +1 -0
  178. package/dist/lib/error-handler.js +458 -0
  179. package/dist/lib/error-handler.js.map +1 -0
  180. package/dist/lib/errors.d.ts +61 -0
  181. package/dist/lib/errors.d.ts.map +1 -0
  182. package/dist/lib/errors.js +168 -0
  183. package/dist/lib/errors.js.map +1 -0
  184. package/dist/lib/formatters.d.ts +55 -0
  185. package/dist/lib/formatters.d.ts.map +1 -0
  186. package/dist/lib/formatters.js +163 -0
  187. package/dist/lib/formatters.js.map +1 -0
  188. package/dist/lib/graph-client.d.ts +74 -0
  189. package/dist/lib/graph-client.d.ts.map +1 -0
  190. package/dist/lib/graph-client.js +231 -0
  191. package/dist/lib/graph-client.js.map +1 -0
  192. package/dist/lib/input.d.ts +22 -0
  193. package/dist/lib/input.d.ts.map +1 -0
  194. package/dist/lib/input.js +120 -0
  195. package/dist/lib/input.js.map +1 -0
  196. package/dist/lib/interactive-wizard.d.ts +26 -0
  197. package/dist/lib/interactive-wizard.d.ts.map +1 -0
  198. package/dist/lib/interactive-wizard.js +550 -0
  199. package/dist/lib/interactive-wizard.js.map +1 -0
  200. package/dist/lib/oss-surface.d.ts +21 -0
  201. package/dist/lib/oss-surface.d.ts.map +1 -0
  202. package/dist/lib/oss-surface.js +29 -0
  203. package/dist/lib/oss-surface.js.map +1 -0
  204. package/dist/lib/output.d.ts +74 -0
  205. package/dist/lib/output.d.ts.map +1 -0
  206. package/dist/lib/output.js +156 -0
  207. package/dist/lib/output.js.map +1 -0
  208. package/dist/lib/picker.d.ts +75 -0
  209. package/dist/lib/picker.d.ts.map +1 -0
  210. package/dist/lib/picker.js +115 -0
  211. package/dist/lib/picker.js.map +1 -0
  212. package/dist/lib/repl.d.ts +19 -0
  213. package/dist/lib/repl.d.ts.map +1 -0
  214. package/dist/lib/repl.js +158 -0
  215. package/dist/lib/repl.js.map +1 -0
  216. package/dist/lib/spinner.d.ts +41 -0
  217. package/dist/lib/spinner.d.ts.map +1 -0
  218. package/dist/lib/spinner.js +126 -0
  219. package/dist/lib/spinner.js.map +1 -0
  220. package/dist/lib/telemetry.d.ts +96 -0
  221. package/dist/lib/telemetry.d.ts.map +1 -0
  222. package/dist/lib/telemetry.js +367 -0
  223. package/dist/lib/telemetry.js.map +1 -0
  224. package/package.json +68 -0
@@ -0,0 +1,433 @@
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 { existsSync } from "node:fs";
17
+ import { resolve } from "node:path";
18
+ import chalk from "chalk";
19
+ import open from "open";
20
+ import { createSpinner } from "../lib/spinner.js";
21
+ import { question, questionHidden } from "../lib/input.js";
22
+ import { handleCommandError } from "../lib/errors.js";
23
+ import { storeClientSecretWithFallback, writeInitConfigFile, } from "./init-config.js";
24
+ import { discoverGdapTenantsWithEnvironments, showEnvironmentSummary, testCredentialsAndGdap, } from "./init-validation.js";
25
+ /**
26
+ * Open a URL in the default browser
27
+ */
28
+ function openUrl(url) {
29
+ open(url);
30
+ }
31
+ /**
32
+ * Run the standard (non-interactive) init wizard flow.
33
+ */
34
+ export async function runInitWizard(options) {
35
+ console.log(chalk.cyan.bold("\n🚀 Pax8 CTA Setup Wizard\n"));
36
+ // If the user is currently in demo mode and didn't pass --demo, confirm
37
+ // before switching them to a real-mode setup. Real init writes Azure AD
38
+ // credentials and disables demo, so users may get here unintentionally
39
+ // (e.g. expecting to refresh their demo).
40
+ if (!options.demo) {
41
+ const { isDemoModeEnabled } = await import("./demo.js");
42
+ if (isDemoModeEnabled()) {
43
+ console.log(chalk.yellow("ℹ️ You're currently in demo mode."));
44
+ console.log(chalk.gray("`init` sets up real Azure AD credentials and will exit demo mode."));
45
+ const confirm = await question(chalk.cyan("Continue? ") + chalk.gray("(y/N) "));
46
+ if (!/^(y|yes)$/i.test(confirm.trim())) {
47
+ console.log();
48
+ console.log(chalk.gray("Setup cancelled."));
49
+ console.log(chalk.gray(" • To refresh demo setup: init --demo"));
50
+ console.log(chalk.gray(" • To exit demo manually: demo off"));
51
+ return;
52
+ }
53
+ console.log();
54
+ }
55
+ }
56
+ // Check if config already exists. options.config can be undefined when
57
+ // the REPL state-reset wipes Commander's option defaults between
58
+ // iterations — fall back to the same default Commander declares.
59
+ const configPath = resolve(process.cwd(), options.config ?? "./config/tenants.yaml");
60
+ if (existsSync(configPath)) {
61
+ console.log(chalk.yellow(`⚠️ Configuration already exists: ${configPath}\n`));
62
+ const overwrite = await question(chalk.white("Overwrite existing configuration? ") + chalk.gray("(y/n) "));
63
+ if (overwrite.toLowerCase() !== "y" && overwrite.toLowerCase() !== "yes") {
64
+ console.log(chalk.gray("\nSetup cancelled. Your existing configuration was preserved."));
65
+ console.log(chalk.gray("To modify settings, edit: " + configPath));
66
+ return;
67
+ }
68
+ console.log();
69
+ }
70
+ if (options.demo) {
71
+ // Demo mode setup
72
+ console.log(chalk.yellow("Setting up in DEMO MODE..."));
73
+ console.log(chalk.gray("You can explore Pax8 CTA features without credentials.\n"));
74
+ const spinner = createSpinner("Enabling demo mode...").start();
75
+ // Enable demo mode
76
+ const { saveCliConfig } = await import("./demo.js");
77
+ saveCliConfig({ demoMode: true });
78
+ spinner.succeed("Demo mode enabled");
79
+ console.log();
80
+ console.log(chalk.green("✓ Setup complete!"));
81
+ console.log();
82
+ console.log(chalk.cyan("Try these commands:"));
83
+ console.log(chalk.gray(" tenants list ") + chalk.dim("# View demo tenants"));
84
+ console.log(chalk.gray(" help ") + chalk.dim("# See all commands"));
85
+ console.log();
86
+ console.log(chalk.dim("To switch to production mode later: demo off"));
87
+ return;
88
+ }
89
+ let partnerTenantId = "";
90
+ let partnerClientId = "";
91
+ let partnerClientSecret = "";
92
+ let clientSecretCreated = false;
93
+ try {
94
+ console.log(chalk.white("We'll need your Azure AD app registration details.\n"));
95
+ // Ask about sign-in (optional helper)
96
+ const wantSignIn = await question(chalk.cyan("Sign in to auto-discover your apps? ") +
97
+ chalk.gray("(y/n) [or press Enter to skip] "));
98
+ if (wantSignIn.toLowerCase() === "y" || wantSignIn.toLowerCase() === "yes") {
99
+ // Device code flow to discover apps
100
+ console.log();
101
+ try {
102
+ const { interactiveLogin } = await import("../lib/auth.js");
103
+ const { GraphClient } = await import("../lib/graph-client.js");
104
+ // Tell user what's happening before opening browser
105
+ console.log(chalk.cyan("Opening Microsoft sign-in..."));
106
+ console.log(chalk.gray(" We'll open: https://microsoft.com/devicelogin\n"));
107
+ const loginResult = await interactiveLogin({
108
+ scopes: ["https://graph.microsoft.com/.default"],
109
+ openBrowser: true, // Auto-open browser
110
+ });
111
+ const spinner = createSpinner().start();
112
+ partnerTenantId = loginResult.tenantId;
113
+ spinner.succeed(`Authenticated to tenant ${partnerTenantId}`);
114
+ // List app registrations
115
+ spinner.start("Fetching your app registrations...");
116
+ const graphClient = new GraphClient({ accessToken: loginResult.accessToken });
117
+ const apps = await graphClient.listAppRegistrations();
118
+ if (apps.length === 0) {
119
+ spinner.warn("No app registrations found");
120
+ console.log(chalk.gray("\nYou'll need to create one first:"));
121
+ console.log(chalk.underline("https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/CreateApplicationBlade"));
122
+ console.log();
123
+ // Fall back to manual entry
124
+ partnerClientId = await question(chalk.white("Client ID (after creating app): "));
125
+ }
126
+ else {
127
+ spinner.succeed(`Found ${apps.length} app registration(s)`);
128
+ console.log();
129
+ // Display apps for selection
130
+ console.log(chalk.cyan("Your App Registrations:\n"));
131
+ apps.forEach((app, index) => {
132
+ console.log(chalk.white(` ${index + 1}. ${app.displayName}`));
133
+ console.log(chalk.gray(` Client ID: ${app.appId}`));
134
+ });
135
+ console.log(chalk.white(` ${apps.length + 1}. Enter manually`));
136
+ console.log();
137
+ const selection = await question(chalk.white("Select an app (number): "));
138
+ const selectedIndex = parseInt(selection, 10) - 1;
139
+ if (selectedIndex >= 0 && selectedIndex < apps.length) {
140
+ const selectedApp = apps[selectedIndex];
141
+ partnerClientId = selectedApp.appId;
142
+ console.log(chalk.green(`\n✓ Selected: ${selectedApp.displayName}`));
143
+ // Offer to create a client secret
144
+ console.log();
145
+ const wantSecret = await question(chalk.cyan("Create a new client secret for this app? ") + chalk.gray("(y/n) "));
146
+ if (wantSecret.toLowerCase() === "y" || wantSecret.toLowerCase() === "yes") {
147
+ const secretSpinner = createSpinner("Creating client secret...").start();
148
+ try {
149
+ const secret = await graphClient.createClientSecret(selectedApp.id, "Pax8 CTA CLI", 24);
150
+ secretSpinner.succeed("Client secret created");
151
+ console.log();
152
+ console.log(chalk.yellow("⚠️ IMPORTANT: Secret created for this app."));
153
+ console.log(chalk.gray(` Expires: ${new Date(secret.endDateTime).toLocaleDateString()}`));
154
+ console.log();
155
+ const canRevealSecret = process.env.CI !== "true";
156
+ let secretWasRevealed = false;
157
+ if (canRevealSecret) {
158
+ const revealSecret = await question(chalk.cyan("Reveal this secret once on screen? ") +
159
+ chalk.gray("(y/n, default: n) "));
160
+ if (revealSecret.toLowerCase() === "y" || revealSecret.toLowerCase() === "yes") {
161
+ console.log(chalk.white(` Secret: ${chalk.bold(secret.secretText)}`));
162
+ console.log();
163
+ secretWasRevealed = true;
164
+ }
165
+ else {
166
+ console.log(chalk.gray(" Secret kept hidden."));
167
+ console.log();
168
+ }
169
+ }
170
+ else {
171
+ console.log(chalk.gray(" CI detected. Secret value will not be displayed."));
172
+ console.log();
173
+ }
174
+ // Offer to store in keychain
175
+ const wantStore = await question(chalk.cyan("Store this secret securely in OS keychain? ") + chalk.gray("(y/n) "));
176
+ if (wantStore.toLowerCase() === "y" || wantStore.toLowerCase() === "yes") {
177
+ const { storeCredentials } = await import("../lib/auth.js");
178
+ await storeCredentials(partnerClientId, secret.secretText, partnerTenantId);
179
+ console.log(chalk.green("✓ Secret stored in keychain"));
180
+ clientSecretCreated = true;
181
+ }
182
+ else if (!secretWasRevealed) {
183
+ console.log(chalk.gray(" Secret was not shown. You'll be prompted to enter one manually next."));
184
+ }
185
+ }
186
+ catch (error) {
187
+ secretSpinner.fail("Failed to create secret");
188
+ console.log(chalk.gray(` ${error instanceof Error ? error.message : "Unknown error"}`));
189
+ console.log(chalk.gray("\n You can create one manually in the Azure Portal."));
190
+ }
191
+ }
192
+ }
193
+ else {
194
+ // Manual entry
195
+ partnerClientId = await question(chalk.white("\nClient ID: "));
196
+ }
197
+ }
198
+ }
199
+ catch (error) {
200
+ console.log(chalk.red("\n✖ Authentication failed"));
201
+ console.log(chalk.gray(` ${error instanceof Error ? error.message : "Unknown error"}`));
202
+ console.log(chalk.gray("\n Falling back to manual setup...\n"));
203
+ // Fall back to manual entry
204
+ partnerTenantId = "";
205
+ partnerClientId = "";
206
+ }
207
+ }
208
+ // Manual entry if not set via auth flow
209
+ if (!partnerTenantId) {
210
+ const tenantIdUrl = "https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview";
211
+ console.log(chalk.cyan("\n1. Partner Tenant ID"));
212
+ console.log(chalk.gray(" Your Microsoft Entra (Azure AD) tenant ID."));
213
+ const tenantInput = await question(chalk.white(" Tenant ID ") + chalk.gray("(or 'o' to open Azure Portal): "));
214
+ if (tenantInput.toLowerCase() === "o" || tenantInput.toLowerCase() === "open") {
215
+ openUrl(tenantIdUrl);
216
+ console.log(chalk.green(" ✓ Opened - look for 'Tenant ID'"));
217
+ partnerTenantId = await question(chalk.white(" Tenant ID: "));
218
+ }
219
+ else {
220
+ partnerTenantId = tenantInput;
221
+ }
222
+ }
223
+ if (!partnerClientId) {
224
+ const appRegUrl = "https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade";
225
+ console.log(chalk.cyan("\n2. App Registration Client ID"));
226
+ console.log(chalk.gray(" The Application (client) ID of your Azure AD app."));
227
+ const clientInput = await question(chalk.white(" Client ID ") + chalk.gray("(or 'o' to open Azure Portal): "));
228
+ if (clientInput.toLowerCase() === "o" || clientInput.toLowerCase() === "open") {
229
+ openUrl(appRegUrl);
230
+ console.log(chalk.green(" ✓ Opened - select your app, copy 'Application (client) ID'"));
231
+ partnerClientId = await question(chalk.white(" Client ID: "));
232
+ }
233
+ else {
234
+ partnerClientId = clientInput;
235
+ }
236
+ }
237
+ // Client Secret (only if not already created via sign-in flow)
238
+ if (!clientSecretCreated) {
239
+ const secretUrl = `https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationMenuBlade/~/Credentials/appId/${partnerClientId}/isMSAApp~/false`;
240
+ console.log(chalk.cyan("\n3. Client Secret"));
241
+ console.log(chalk.gray(" The secret Value from your app registration (not the Secret ID)."));
242
+ let clientSecret = await questionHidden(chalk.white(" Secret Value ") + chalk.gray("(or 'o' to open Azure Portal): "));
243
+ if (clientSecret.toLowerCase() === "o" || clientSecret.toLowerCase() === "open") {
244
+ openUrl(secretUrl);
245
+ console.log(chalk.green(" ✓ Opened - click 'New client secret', copy the 'Value'"));
246
+ clientSecret = await questionHidden(chalk.white(" Secret Value: "));
247
+ }
248
+ if (clientSecret) {
249
+ const storeResult = await storeClientSecretWithFallback(partnerTenantId, partnerClientId, clientSecret);
250
+ partnerClientSecret = storeResult.partnerClientSecret;
251
+ clientSecretCreated = storeResult.clientSecretCreated;
252
+ }
253
+ else {
254
+ console.log(chalk.gray(' You can add it later: export PARTNER_CLIENT_SECRET="..."'));
255
+ }
256
+ }
257
+ // Source environment (where agents are developed)
258
+ let sourceEnvironmentUrl = "";
259
+ console.log(chalk.cyan("\n4. Source Environment"));
260
+ console.log(chalk.gray(" The Power Platform environment where you develop agents.\n"));
261
+ // Try discovering environments via Global Discovery Service
262
+ if (partnerClientSecret) {
263
+ try {
264
+ const { TokenManager } = await import("@pax8-cta/core");
265
+ const tokenManager = new TokenManager({
266
+ tenantId: partnerTenantId,
267
+ clientId: partnerClientId,
268
+ clientSecret: partnerClientSecret,
269
+ });
270
+ const dvToken = await tokenManager.getToken([
271
+ "https://globaldisco.crm.dynamics.com/.default",
272
+ ]);
273
+ const resp = await fetch("https://globaldisco.crm.dynamics.com/api/discovery/v2.0/Instances", {
274
+ headers: { Authorization: `Bearer ${dvToken}` },
275
+ });
276
+ if (resp.ok) {
277
+ const data = (await resp.json());
278
+ const instances = (data.value || []).filter((i) => i.State === 0);
279
+ if (instances.length > 0) {
280
+ console.log(chalk.green(` Found ${instances.length} environment(s):\n`));
281
+ instances.forEach((env, i) => {
282
+ console.log(chalk.white(` ${i + 1}. ${env.FriendlyName}`));
283
+ console.log(chalk.gray(` ${env.Url}`));
284
+ });
285
+ console.log(chalk.white(` ${instances.length + 1}. Enter manually`));
286
+ console.log(chalk.white(` ${instances.length + 2}. Skip for now`));
287
+ console.log();
288
+ const selection = await question(chalk.white(" Select source environment (number): "));
289
+ const idx = parseInt(selection, 10) - 1;
290
+ if (idx >= 0 && idx < instances.length) {
291
+ sourceEnvironmentUrl = instances[idx].Url;
292
+ console.log(chalk.green(` ✓ Source: ${instances[idx].FriendlyName}`));
293
+ }
294
+ else if (idx === instances.length) {
295
+ sourceEnvironmentUrl = await question(chalk.white(" Source environment URL: "));
296
+ }
297
+ // else: skip
298
+ }
299
+ }
300
+ }
301
+ catch {
302
+ // Discovery failed - fall through to manual prompt
303
+ }
304
+ }
305
+ // Fall back to manual entry if discovery didn't produce a result
306
+ if (!sourceEnvironmentUrl) {
307
+ sourceEnvironmentUrl = await question(chalk.white(" Source environment URL ") +
308
+ chalk.gray("(e.g. https://org123.crm.dynamics.com, or Enter to skip): "));
309
+ }
310
+ // Try to discover tenants via GDAP (automatic unless --no-gdap)
311
+ console.log();
312
+ const tenants = [];
313
+ // If we have credentials, try GDAP discovery automatically
314
+ if (clientSecretCreated && options.gdap !== false) {
315
+ const discovered = await discoverGdapTenantsWithEnvironments(partnerTenantId, partnerClientId, partnerClientSecret);
316
+ if (discovered.length > 0) {
317
+ console.log();
318
+ // Let user select which tenants/environments to add
319
+ for (const tenant of discovered) {
320
+ if (tenant.environments.length === 0) {
321
+ console.log(chalk.gray(` ${tenant.name}: No Dataverse environments found, skipping`));
322
+ continue;
323
+ }
324
+ const add = await question(chalk.white(` Add ${tenant.name}? `) +
325
+ chalk.gray(`(${tenant.environments.length} environment(s)) `) +
326
+ chalk.gray("(y/n) "));
327
+ if (add.toLowerCase() === "y" || add.toLowerCase() === "yes") {
328
+ // If multiple environments, let them pick or add all
329
+ if (tenant.environments.length === 1) {
330
+ const env = tenant.environments[0];
331
+ tenants.push({
332
+ tenantId: tenant.tenantId,
333
+ name: `${tenant.name}`,
334
+ environmentUrl: env.instanceUrl,
335
+ });
336
+ console.log(chalk.green(` ✓ Added ${tenant.name} (${env.displayName})`));
337
+ }
338
+ else {
339
+ // Multiple environments - show list
340
+ console.log(chalk.cyan(` Environments for ${tenant.name}:`));
341
+ tenant.environments.forEach((env, i) => {
342
+ console.log(chalk.gray(` ${i + 1}. ${env.displayName} (${env.type}) - ${env.instanceUrl}`));
343
+ });
344
+ const envChoice = await question(chalk.white(" Add which? ") + chalk.gray("(number, 'all', or 'skip') "));
345
+ if (envChoice.toLowerCase() === "all") {
346
+ for (const env of tenant.environments) {
347
+ tenants.push({
348
+ tenantId: tenant.tenantId,
349
+ name: `${tenant.name} - ${env.displayName}`,
350
+ environmentUrl: env.instanceUrl,
351
+ });
352
+ }
353
+ console.log(chalk.green(` ✓ Added all ${tenant.environments.length} environments`));
354
+ }
355
+ else if (envChoice.toLowerCase() !== "skip") {
356
+ const envIndex = parseInt(envChoice, 10) - 1;
357
+ if (envIndex >= 0 && envIndex < tenant.environments.length) {
358
+ const env = tenant.environments[envIndex];
359
+ tenants.push({
360
+ tenantId: tenant.tenantId,
361
+ name: `${tenant.name} - ${env.displayName}`,
362
+ environmentUrl: env.instanceUrl,
363
+ });
364
+ console.log(chalk.green(` ✓ Added ${env.displayName}`));
365
+ }
366
+ }
367
+ }
368
+ }
369
+ }
370
+ }
371
+ }
372
+ // If --no-gdap was specified, mention it
373
+ if (options.gdap === false && clientSecretCreated) {
374
+ console.log(chalk.gray("GDAP discovery skipped (--no-gdap). You can add tenants manually.\n"));
375
+ }
376
+ // If no tenants added yet, offer manual entry
377
+ if (tenants.length === 0) {
378
+ console.log(chalk.cyan("\n5. Target Tenants"));
379
+ console.log(chalk.gray(" Customer tenants where agents will be deployed."));
380
+ console.log(chalk.gray(" These must be real Microsoft 365 tenants your app has access to"));
381
+ console.log(chalk.gray(" (via GDAP or direct app consent). You can add them later.\n"));
382
+ const addTenant = await question(chalk.white(" Add a target tenant now? ") + chalk.gray("(y/n, most users skip this) "));
383
+ if (addTenant.toLowerCase() === "y" || addTenant.toLowerCase() === "yes") {
384
+ let addMore = true;
385
+ while (addMore) {
386
+ console.log(chalk.cyan(`\n Tenant ${tenants.length + 1}:`));
387
+ const tenantName = await question(chalk.white(" Name (e.g., Contoso): "));
388
+ const tenantId = await question(chalk.white(" Tenant ID (Azure AD GUID): "));
389
+ const envUrl = await question(chalk.white(" Environment URL (e.g., https://contoso.crm.dynamics.com): "));
390
+ if (tenantName && tenantId && envUrl) {
391
+ tenants.push({ tenantId, name: tenantName, environmentUrl: envUrl });
392
+ console.log(chalk.green(` ✓ Added ${tenantName}`));
393
+ }
394
+ const another = await question(chalk.white("\n Add another tenant? ") + chalk.gray("(y/n) "));
395
+ addMore = another.toLowerCase() === "y" || another.toLowerCase() === "yes";
396
+ }
397
+ }
398
+ }
399
+ // Create config (keep rl open for test prompt later)
400
+ console.log(chalk.cyan("\n Creating configuration..."));
401
+ writeInitConfigFile(configPath, partnerTenantId, partnerClientId, sourceEnvironmentUrl, tenants);
402
+ // Disable demo mode since user is setting up real credentials
403
+ const { saveCliConfig } = await import("./demo.js");
404
+ saveCliConfig({ demoMode: false });
405
+ // Offer to test credentials and discover GDAP tenants
406
+ console.log();
407
+ const testConnection = await question(chalk.cyan("Test your credentials now? ") + chalk.gray("(y/n) "));
408
+ if (testConnection.toLowerCase() === "y" || testConnection.toLowerCase() === "yes") {
409
+ await testCredentialsAndGdap(partnerTenantId, partnerClientId, partnerClientSecret, tenants);
410
+ }
411
+ console.log();
412
+ console.log(chalk.green.bold("✓ Setup complete!\n"));
413
+ // Show live environment summary if we have credentials and tenants
414
+ if (partnerClientSecret && (sourceEnvironmentUrl || tenants.length > 0)) {
415
+ await showEnvironmentSummary(partnerTenantId, partnerClientId, partnerClientSecret, sourceEnvironmentUrl, tenants);
416
+ }
417
+ else if (tenants.length === 0) {
418
+ console.log(chalk.cyan("Next steps:"));
419
+ console.log();
420
+ console.log(chalk.white(" 1. Add target tenants to your config:"));
421
+ console.log(chalk.gray(" " + configPath));
422
+ console.log();
423
+ console.log(chalk.white(" 2. Verify your configuration:"));
424
+ console.log(chalk.gray(" tenants list -c " + options.config));
425
+ console.log();
426
+ }
427
+ console.log(chalk.dim("Run 'help' to see all available commands."));
428
+ }
429
+ catch (error) {
430
+ handleCommandError(error, null, "Setup failed");
431
+ }
432
+ }
433
+ //# sourceMappingURL=init-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-wizard.js","sourceRoot":"","sources":["../../src/commands/init-wizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,6BAA6B,EAE7B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mCAAmC,EACnC,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAQ9B;;GAEG;AACH,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAE7D,wEAAwE;IACxE,wEAAwE;IACxE,uEAAuE;IACvE,0CAA0C;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,iBAAiB,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC,CAAC;YAC7F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,iEAAiE;IACjE,iEAAiE;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,uBAAuB,CAAC,CAAC;IAErF,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,UAAU,IAAI,CAAC,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzE,CAAC;QAEF,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,GAAG,UAAU,CAAC,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;QAEpF,MAAM,OAAO,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;QAE/D,mBAAmB;QACnB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACpD,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAElC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAErC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,mBAAmB,GAAG,EAAE,CAAC;IAC7B,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAEjF,sCAAsC;QACtC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAC/B,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAChD,CAAC;QAEF,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YAC3E,oCAAoC;YACpC,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,CAAC;gBACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAC5D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;gBAE/D,oDAAoD;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;gBAE9E,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC;oBACzC,MAAM,EAAE,CAAC,sCAAsC,CAAC;oBAChD,WAAW,EAAE,IAAI,EAAE,oBAAoB;iBACxC,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC;gBAExC,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC;gBACvC,OAAO,CAAC,OAAO,CAAC,2BAA2B,eAAe,EAAE,CAAC,CAAC;gBAE9D,yBAAyB;gBACzB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9E,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,oBAAoB,EAAE,CAAC;gBAEtD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;oBAC9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,SAAS,CACb,oFAAoF,CACrF,CACF,CAAC;oBACF,OAAO,CAAC,GAAG,EAAE,CAAC;oBAEd,4BAA4B;oBAC5B,eAAe,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBACpF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,sBAAsB,CAAC,CAAC;oBAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;oBAEd,6BAA6B;oBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;oBACrD,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;wBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC1D,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,EAAE,CAAC;oBAEd,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;oBAC1E,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;oBAElD,IAAI,aAAa,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;wBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;wBACxC,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC;wBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBAErE,kCAAkC;wBAClC,OAAO,CAAC,GAAG,EAAE,CAAC;wBACd,MAAM,UAAU,GAAG,MAAM,QAAQ,CAC/B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC/E,CAAC;wBAEF,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;4BAC3E,MAAM,aAAa,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;4BACzE,IAAI,CAAC;gCACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,kBAAkB,CACjD,WAAW,CAAC,EAAE,EACd,cAAc,EACd,EAAE,CACH,CAAC;gCAEF,aAAa,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gCAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;gCACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;gCACzE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAC/E,CAAC;gCACF,OAAO,CAAC,GAAG,EAAE,CAAC;gCAEd,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC;gCAClD,IAAI,iBAAiB,GAAG,KAAK,CAAC;gCAE9B,IAAI,eAAe,EAAE,CAAC;oCACpB,MAAM,YAAY,GAAG,MAAM,QAAQ,CACjC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC;wCAC/C,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACnC,CAAC;oCAEF,IAAI,YAAY,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;wCAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;wCACxE,OAAO,CAAC,GAAG,EAAE,CAAC;wCACd,iBAAiB,GAAG,IAAI,CAAC;oCAC3B,CAAC;yCAAM,CAAC;wCACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;wCAClD,OAAO,CAAC,GAAG,EAAE,CAAC;oCAChB,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;oCAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;gCAChB,CAAC;gCAED,6BAA6B;gCAC7B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CACjF,CAAC;gCAEF,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;oCACzE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;oCAC5D,MAAM,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;oCAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;oCACxD,mBAAmB,GAAG,IAAI,CAAC;gCAC7B,CAAC;qCAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;oCAC9B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,yEAAyE,CAC1E,CACF,CAAC;gCACJ,CAAC;4BACH,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gCAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAC7E,CAAC;gCACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;4BACnF,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,eAAe;wBACf,eAAe,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;gBAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAElE,4BAA4B;gBAC5B,eAAe,GAAG,EAAE,CAAC;gBACrB,eAAe,GAAG,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,WAAW,GACf,sFAAsF,CAAC;YAEzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAEzE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAC7E,CAAC;YAEF,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAC9E,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAC/D,eAAe,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,eAAe,GAAG,WAAW,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,SAAS,GACb,mFAAmF,CAAC;YAEtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAEhF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAC7E,CAAC;YAEF,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAC9E,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;gBAC1F,eAAe,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,eAAe,GAAG,WAAW,CAAC;YAChC,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,wGAAwG,eAAe,kBAAkB,CAAC;YAE5J,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAClF,CAAC;YAEF,IAAI,YAAY,GAAG,MAAM,cAAc,CACrC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAChF,CAAC;YAEF,IAAI,YAAY,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAChF,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC,CAAC;gBACtF,YAAY,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACxE,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,WAAW,GAAG,MAAM,6BAA6B,CACrD,eAAe,EACf,eAAe,EACf,YAAY,CACb,CAAC;gBACF,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC;gBACtD,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,IAAI,oBAAoB,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAEzF,4DAA4D;QAC5D,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;oBACpC,QAAQ,EAAE,eAAe;oBACzB,QAAQ,EAAE,eAAe;oBACzB,YAAY,EAAE,mBAAmB;iBAClC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC;oBAC1C,+CAA+C;iBAChD,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,mEAAmE,EACnE;oBACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,EAAE,EAAE;iBAChD,CACF,CAAC;gBAEF,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;oBACF,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;oBAElE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,SAAS,CAAC,MAAM,oBAAoB,CAAC,CAAC,CAAC;wBAC3E,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;4BAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;4BAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBAC9C,CAAC,CAAC,CAAC;wBACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,MAAM,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;wBACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;wBACrE,OAAO,CAAC,GAAG,EAAE,CAAC;wBAEd,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CACvD,CAAC;wBACF,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;wBAExC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;4BACvC,oBAAoB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;4BAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,SAAS,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;wBAC1E,CAAC;6BAAM,IAAI,GAAG,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;4BACpC,oBAAoB,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;wBACpF,CAAC;wBACD,aAAa;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,oBAAoB,GAAG,MAAM,QAAQ,CACnC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAC3E,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,2DAA2D;QAC3D,IAAI,mBAAmB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAClD,MAAM,UAAU,GAAG,MAAM,mCAAmC,CAC1D,eAAe,EACf,eAAe,EACf,mBAAmB,CACpB,CAAC;YAEF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;gBAEd,oDAAoD;gBACpD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;oBAChC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,6CAA6C,CAAC,CAAC,CAAC;wBACxF,SAAS;oBACX,CAAC;oBAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,KAAK,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,IAAI,CAAC;wBACpC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,mBAAmB,CAAC;wBAC7D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CACvB,CAAC;oBAEF,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;wBAC7D,qDAAqD;wBACrD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BACrC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;4BACnC,OAAO,CAAC,IAAI,CAAC;gCACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE;gCACtB,cAAc,EAAE,GAAG,CAAC,WAAW;6BAChC,CAAC,CAAC;4BACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;wBAC7E,CAAC;6BAAM,CAAC;4BACN,oCAAoC;4BACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;4BAC/D,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gCACrC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,CACnF,CAAC;4BACJ,CAAC,CAAC,CAAC;4BAEH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAC1E,CAAC;4BAEF,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gCACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oCACtC,OAAO,CAAC,IAAI,CAAC;wCACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;wCACzB,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,WAAW,EAAE;wCAC3C,cAAc,EAAE,GAAG,CAAC,WAAW;qCAChC,CAAC,CAAC;gCACL,CAAC;gCACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,YAAY,CAAC,MAAM,eAAe,CAAC,CACzE,CAAC;4BACJ,CAAC;iCAAM,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gCAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gCAC7C,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oCAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oCAC1C,OAAO,CAAC,IAAI,CAAC;wCACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;wCACzB,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,WAAW,EAAE;wCAC3C,cAAc,EAAE,GAAG,CAAC,WAAW;qCAChC,CAAC,CAAC;oCACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gCAC5D,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,mBAAmB,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAClF,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC,CAAC;YAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;YAE1F,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CACzF,CAAC;YAEF,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBACzE,IAAI,OAAO,GAAG,IAAI,CAAC;gBACnB,OAAO,OAAO,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAE9D,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;oBAC9E,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;oBACjF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,KAAK,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAC/E,CAAC;oBAEF,IAAI,UAAU,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;wBACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAC;oBACzD,CAAC;oBAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChE,CAAC;oBACF,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACzD,mBAAmB,CACjB,UAAU,EACV,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,OAAO,CACR,CAAC;QAEF,8DAA8D;QAC9D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACpD,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnC,sDAAsD;QACtD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,cAAc,GAAG,MAAM,QAAQ,CACnC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CACjE,CAAC;QAEF,IAAI,cAAc,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,cAAc,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YACnF,MAAM,sBAAsB,CAAC,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC/F,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAErD,mEAAmE;QACnE,IAAI,mBAAmB,IAAI,CAAC,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,sBAAsB,CAC1B,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
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 { Command } from "commander";
17
+ export declare const initCommand: Command;
18
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SA0BpB,CAAC"}
@@ -0,0 +1,46 @@
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 { Command } from "commander";
17
+ import { handleCommandError } from "../lib/errors.js";
18
+ import { runInitWizard } from "./init-wizard.js";
19
+ const DEFAULT_CONFIG_PATH = "./config/tenants.yaml";
20
+ export const initCommand = new Command("init")
21
+ .description("Initialize Pax8 CTA with guided setup")
22
+ .option("-c, --config <path>", "Path to create manifest file", DEFAULT_CONFIG_PATH)
23
+ .option("--demo", "Set up in demo mode (skip credential prompts)")
24
+ .option("--no-gdap", "Skip automatic GDAP tenant discovery (for non-MSP setups)")
25
+ .option("--interactive", "Run interactive setup wizard with Azure AD app creation")
26
+ .action(async (options) => {
27
+ // Handle interactive mode
28
+ if (options.interactive) {
29
+ const { runInteractiveWizard } = await import("../lib/interactive-wizard.js");
30
+ try {
31
+ const result = await runInteractiveWizard(options.config);
32
+ if (result.success) {
33
+ process.exit(0);
34
+ }
35
+ else {
36
+ process.exit(1);
37
+ }
38
+ }
39
+ catch (error) {
40
+ handleCommandError(error, null, "Interactive setup failed");
41
+ }
42
+ return;
43
+ }
44
+ await runInitWizard(options);
45
+ });
46
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,EAAE,mBAAmB,CAAC;KAClF,MAAM,CAAC,QAAQ,EAAE,+CAA+C,CAAC;KACjE,MAAM,CAAC,WAAW,EAAE,2DAA2D,CAAC;KAChF,MAAM,CAAC,eAAe,EAAE,yDAAyD,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,0BAA0B;IAC1B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
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 { Command } from "commander";
17
+ export declare const resolveUrlCommand: Command;
18
+ //# sourceMappingURL=resolve-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-url.d.ts","sourceRoot":"","sources":["../../src/commands/resolve-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,iBAAiB,SA6H1B,CAAC"}