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 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,aAAa,SAoItB,CAAC"}
@@ -0,0 +1,133 @@
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 { resolve, join, dirname } from "node:path";
18
+ import { fileURLToPath } from "node:url";
19
+ import { copyFileSync, mkdirSync, existsSync } from "node:fs";
20
+ import chalk from "chalk";
21
+ import { createSpinner, isQuietMode } from "../lib/spinner.js";
22
+ import { TokenManager, DataverseClient, SolutionOperations } from "@pax8-cta/core";
23
+ import { withResolvedConfig } from "../lib/command-wrapper.js";
24
+ import { getClientSecretWithFallback } from "../lib/credentials.js";
25
+ import { handleCommandError } from "../lib/errors.js";
26
+ import { showDemoBanner } from "../lib/demo-banner.js";
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = dirname(__filename);
29
+ export const exportCommand = new Command("export")
30
+ .description("Export a solution from your source environment as a zip file")
31
+ .argument("[solution]", "Solution name (e.g., TestDeploy)")
32
+ .option("-s, --solution <name>", "Solution name (alternative to argument)")
33
+ .option("-o, --output <path>", "Output directory for the zip file", "./agent packages")
34
+ .option("-c, --config <path>", "Path to config file", "./config/tenants.yaml")
35
+ .option("--unmanaged", "Export as unmanaged (default: managed)")
36
+ .addHelpText("after", `
37
+ Examples:
38
+ export TestDeploy Export as managed solution
39
+ export TestDeploy --unmanaged Export as unmanaged
40
+ export TestDeploy -o ./my-exports Export to custom directory
41
+ `)
42
+ .action(async (solutionArg, options) => {
43
+ if (solutionArg && !options.solution)
44
+ options.solution = solutionArg;
45
+ if (!options.solution) {
46
+ console.error(chalk.red("Error: solution name required."));
47
+ if (!isQuietMode()) {
48
+ console.error(chalk.gray(" Example: export TestDeploy"));
49
+ }
50
+ process.exit(2);
51
+ }
52
+ const spinner = createSpinner("Loading manifest...").start();
53
+ try {
54
+ await withResolvedConfig(options, async () => {
55
+ spinner.succeed("Demo mode - using sample agent package");
56
+ if (!isQuietMode()) {
57
+ showDemoBanner();
58
+ }
59
+ // Create output directory
60
+ const outputDir = resolve(options.output);
61
+ if (!existsSync(outputDir)) {
62
+ mkdirSync(outputDir, { recursive: true });
63
+ }
64
+ // Copy demo solution
65
+ const managed = !options.unmanaged;
66
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
67
+ const suffix = managed ? "managed" : "unmanaged";
68
+ const outputPath = join(outputDir, `${options.solution}_${timestamp}_${suffix}.zip`);
69
+ // Find demo solution (relative to CLI dist or source)
70
+ const demoSolutionPath = join(__dirname, "../../demo-data/solutions/ProductQADemo_1_0_0_2_managed.zip");
71
+ if (existsSync(demoSolutionPath)) {
72
+ copyFileSync(demoSolutionPath, outputPath);
73
+ }
74
+ else {
75
+ // Fallback - create a simple message
76
+ console.log(chalk.yellow("Note: Demo solution file not found, but in production this would create:"));
77
+ console.log(chalk.cyan(` ${outputPath}`));
78
+ }
79
+ console.log(chalk.bold("\n📦 Agent Package Packed:"));
80
+ console.log(` Agent: ${chalk.green(options.solution)} (Demo)`);
81
+ console.log(` Version: 1.0.0.2`);
82
+ console.log(` Type: ${managed ? "Managed" : "Unmanaged"}`);
83
+ console.log(` Package: ${chalk.cyan(outputPath)}`);
84
+ console.log();
85
+ console.log(chalk.gray(`Use 'deploy <solution> --all' to deploy to your tenants`));
86
+ }, async (config) => {
87
+ spinner.succeed("Manifest loaded");
88
+ // Get client secret
89
+ spinner.start("Authenticating with directory...");
90
+ const clientSecret = await getClientSecretWithFallback();
91
+ const tokenManager = new TokenManager({
92
+ tenantId: config.partner.tenantId,
93
+ clientId: config.partner.clientId,
94
+ clientSecret,
95
+ });
96
+ const dataverseClient = new DataverseClient({
97
+ environmentUrl: config.source.environmentUrl,
98
+ tokenManager,
99
+ });
100
+ const solutionOps = new SolutionOperations(dataverseClient);
101
+ spinner.succeed("Connected to source directory");
102
+ // Build output path
103
+ const managed = !options.unmanaged;
104
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19);
105
+ const suffix = managed ? "managed" : "unmanaged";
106
+ const outputDir = resolve(options.output);
107
+ // Create output directory if it doesn't exist
108
+ if (!existsSync(outputDir)) {
109
+ mkdirSync(outputDir, { recursive: true });
110
+ }
111
+ const outputPath = join(outputDir, `${options.solution}_${timestamp}_${suffix}.zip`);
112
+ // Export solution
113
+ spinner.start(`Packing solution '${options.solution}' into agent package...`);
114
+ const metadata = await solutionOps.exportSolution(options.solution, {
115
+ managed,
116
+ outputPath,
117
+ });
118
+ spinner.succeed(`Agent package packed: ${chalk.green(metadata.friendlyName)} v${metadata.version}`);
119
+ console.log();
120
+ console.log(chalk.bold("Agent package Contents:"));
121
+ console.log(` Agent: ${metadata.friendlyName}`);
122
+ console.log(` Version: ${metadata.version}`);
123
+ console.log(` Type: ${managed ? "Managed" : "Unmanaged"}`);
124
+ console.log(` Agent package: ${chalk.cyan(outputPath)}`);
125
+ console.log();
126
+ console.log(chalk.gray(`Use 'deploy <solution> --all' to deploy to your tenants`));
127
+ });
128
+ }
129
+ catch (error) {
130
+ handleCommandError(error, spinner, "Packing failed");
131
+ }
132
+ });
133
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -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 importCommand: Command;
18
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,aAAa,SAsFtB,CAAC"}
@@ -0,0 +1,129 @@
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 { resolve, join } from "node:path";
18
+ import { existsSync, readdirSync, statSync } from "node:fs";
19
+ import chalk from "chalk";
20
+ import { createSpinner } from "../lib/spinner.js";
21
+ import { loadConfig, findTenant, TokenManager, DataverseClient, SolutionOperations, } from "@pax8-cta/core";
22
+ import { getClientSecretWithFallback } from "../lib/credentials.js";
23
+ import { CliError, handleCommandError } from "../lib/errors.js";
24
+ export const importCommand = new Command("import")
25
+ .description("Import a solution zip file into a single tenant environment")
26
+ .argument("[solution]", "Path to solution zip file")
27
+ .option("-s, --solution <path>", "Path to solution zip (alternative to argument)")
28
+ .option("--agentPackage <path>", "Alias for --solution")
29
+ .requiredOption("-t, --tenant <name>", "Target tenant name or ID")
30
+ .option("--destination <id>", "Alias for --tenant")
31
+ .option("-c, --config <path>", "Path to config file", "./config/tenants.yaml")
32
+ .option("--no-overwrite", "Do not overwrite existing customizations")
33
+ .option("--no-publish", "Do not activate workflows after import")
34
+ .addHelpText("after", `
35
+ Examples:
36
+ import ./TestDeploy.zip -t Pax8CTA-Test2 Import to a specific tenant
37
+ import ./TestDeploy.zip -t Pax8CTA-Test2 --no-publish
38
+ `)
39
+ .action(async (solutionArg, options) => {
40
+ if (solutionArg && !options.solution)
41
+ options.solution = solutionArg;
42
+ const spinner = createSpinner("Loading configuration...").start();
43
+ try {
44
+ // Load config
45
+ const configPath = resolve(process.cwd(), options.config);
46
+ const config = await loadConfig(configPath);
47
+ // Find target tenant (destination) by ID, name, or environment URL
48
+ const destinationId = options.destination || options.tenant;
49
+ const destination = findTenant(config, destinationId);
50
+ if (!destination) {
51
+ throw new CliError(`Destination '${destinationId}' not found in manifest. Run 'tenants list' to see available tenants.`);
52
+ }
53
+ spinner.succeed(`Manifest loaded - Destination: ${destination.name}`);
54
+ // Get client secret
55
+ spinner.start("Establishing connection to target tenant...");
56
+ const clientSecret = await getClientSecretWithFallback();
57
+ // Create token manager for the customer tenant
58
+ const tokenManager = new TokenManager({
59
+ tenantId: destination.tenantId,
60
+ clientId: config.partner.clientId,
61
+ clientSecret,
62
+ });
63
+ const dataverseClient = new DataverseClient({
64
+ environmentUrl: destination.environmentUrl,
65
+ tokenManager,
66
+ });
67
+ const solutionOps = new SolutionOperations(dataverseClient);
68
+ spinner.succeed(`Connected to ${destination.name}`);
69
+ // Import solution package into the target environment
70
+ const agentPackagePath = resolveAgentPackage(options.agentPackage || options.solution);
71
+ spinner.start(`Importing solution to ${destination.name}...`);
72
+ const importJobId = await solutionOps.importSolutionAsync(agentPackagePath, {
73
+ overwriteUnmanagedCustomizations: options.overwrite !== false,
74
+ publishWorkflows: options.publish !== false,
75
+ });
76
+ spinner.text = `Import in progress (Job ID: ${importJobId})...`;
77
+ // Wait for import with progress
78
+ const result = await solutionOps.waitForImport(importJobId, {
79
+ pollIntervalMs: 3000,
80
+ timeoutMs: 300000,
81
+ onProgress: (progress) => {
82
+ spinner.text = `Importing to ${destination.name}... ${progress}%`;
83
+ },
84
+ });
85
+ if (result.success) {
86
+ spinner.succeed(chalk.green(`✅ Solution imported successfully to ${destination.name}`));
87
+ }
88
+ else {
89
+ const errorMsg = result.error || "Unknown error - check solution compatibility and permissions";
90
+ throw new CliError(`Import failed: ${errorMsg}`);
91
+ }
92
+ }
93
+ catch (error) {
94
+ handleCommandError(error, spinner, "Import failed");
95
+ }
96
+ });
97
+ /**
98
+ * Resolve a solution argument to an actual file path.
99
+ * If the argument looks like an explicit path (contains / or .zip), resolve it directly.
100
+ * Otherwise, treat it as a solution name and search "agent packages/" for the
101
+ * most recent matching zip.
102
+ */
103
+ function resolveAgentPackage(input) {
104
+ // If it looks like an explicit file path, resolve directly (let downstream handle missing)
105
+ if (input.includes("/") || input.includes("\\") || input.endsWith(".zip")) {
106
+ return resolve(input);
107
+ }
108
+ // Check if the exact name exists as a file (unlikely but handle it)
109
+ const direct = resolve(input);
110
+ if (existsSync(direct))
111
+ return direct;
112
+ // Treat as solution name — search "agent packages/" for matching zips
113
+ const agentPackagesDir = resolve(process.cwd(), "agent packages");
114
+ if (existsSync(agentPackagesDir)) {
115
+ const matches = readdirSync(agentPackagesDir)
116
+ .filter((f) => f.startsWith(input) && f.endsWith(".zip"))
117
+ .map((f) => ({
118
+ name: f,
119
+ path: join(agentPackagesDir, f),
120
+ mtime: statSync(join(agentPackagesDir, f)).mtimeMs,
121
+ }))
122
+ .sort((a, b) => b.mtime - a.mtime);
123
+ if (matches.length > 0) {
124
+ return matches[0].path;
125
+ }
126
+ }
127
+ throw new CliError(`Solution '${input}' not found.\nNo matching zips in 'agent packages/'.\nTip: Export first with 'export ${input}', then retry.`);
128
+ }
129
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,eAAe,EACf,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,6DAA6D,CAAC;KAC1E,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAC;KACnD,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;KACvD,cAAc,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACjE,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,uBAAuB,CAAC;KAC7E,MAAM,CAAC,gBAAgB,EAAE,0CAA0C,CAAC;KACpE,MAAM,CAAC,cAAc,EAAE,wCAAwC,CAAC;KAChE,WAAW,CACV,OAAO,EACP;;;;CAIH,CACE;KACA,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAAO,EAAE,EAAE;IACzD,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC;IACrE,MAAM,OAAO,GAAG,aAAa,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAElE,IAAI,CAAC;QACH,cAAc;QACd,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,mEAAmE;QACnE,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;QAC5D,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,aAAa,uEAAuE,CACrG,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,kCAAkC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtE,oBAAoB;QACpB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,MAAM,2BAA2B,EAAE,CAAC;QAEzD,+CAA+C;QAC/C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;YACpC,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,YAAY;SACb,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC;YAC1C,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,YAAY;SACb,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAC5D,OAAO,CAAC,OAAO,CAAC,gBAAgB,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAEpD,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,yBAAyB,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,mBAAmB,CAAC,gBAAgB,EAAE;YAC1E,gCAAgC,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK;YAC7D,gBAAgB,EAAE,OAAO,CAAC,OAAO,KAAK,KAAK;SAC5C,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,GAAG,+BAA+B,WAAW,MAAM,CAAC;QAEhE,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE;YAC1D,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACvB,OAAO,CAAC,IAAI,GAAG,gBAAgB,WAAW,CAAC,IAAI,OAAO,QAAQ,GAAG,CAAC;YACpE,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GACZ,MAAM,CAAC,KAAK,IAAI,8DAA8D,CAAC;YACjF,MAAM,IAAI,QAAQ,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,2FAA2F;IAC3F,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,oEAAoE;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAEtC,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC;aAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACxD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC/B,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO;SACnD,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,QAAQ,CAChB,aAAa,KAAK,wFAAwF,KAAK,gBAAgB,CAChI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
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
+ export interface InitTenantInput {
17
+ tenantId: string;
18
+ name: string;
19
+ environmentUrl: string;
20
+ }
21
+ export declare function storeClientSecretWithFallback(partnerTenantId: string, partnerClientId: string, clientSecret: string): Promise<{
22
+ partnerClientSecret: string;
23
+ clientSecretCreated: boolean;
24
+ }>;
25
+ export declare function writeInitConfigFile(configPath: string, partnerTenantId: string, partnerClientId: string, sourceEnvironmentUrl: string, tenants: InitTenantInput[]): void;
26
+ //# sourceMappingURL=init-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-config.d.ts","sourceRoot":"","sources":["../../src/commands/init-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,6BAA6B,CACjD,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,mBAAmB,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,OAAO,CAAA;CAAE,CAAC,CA6DxE;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,EAC5B,OAAO,EAAE,eAAe,EAAE,GACzB,IAAI,CAoDN"}
@@ -0,0 +1,123 @@
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 chalk from "chalk";
17
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
18
+ import { dirname, resolve } from "node:path";
19
+ export async function storeClientSecretWithFallback(partnerTenantId, partnerClientId, clientSecret) {
20
+ try {
21
+ const { storeCredentials } = await import("../lib/auth.js");
22
+ await storeCredentials(partnerClientId, clientSecret, partnerTenantId);
23
+ console.log(chalk.green(" ✓ Secret stored securely in OS keychain"));
24
+ return {
25
+ partnerClientSecret: clientSecret,
26
+ clientSecretCreated: true,
27
+ };
28
+ }
29
+ catch {
30
+ // Keychain failed, save to .env file automatically
31
+ const envPath = resolve(process.cwd(), ".env");
32
+ const envContent = existsSync(envPath) ? readFileSync(envPath, "utf-8") : "";
33
+ // Check if PARTNER_CLIENT_SECRET already exists
34
+ if (envContent.includes("PARTNER_CLIENT_SECRET=")) {
35
+ console.log(chalk.green(" ✓ Secret already configured in .env"));
36
+ // Load the existing secret from .env into memory
37
+ const match = envContent.match(/PARTNER_CLIENT_SECRET=(.+)/);
38
+ return {
39
+ partnerClientSecret: match?.[1]?.trim() || clientSecret,
40
+ clientSecretCreated: true,
41
+ };
42
+ }
43
+ const newContent = envContent.endsWith("\n") || envContent === ""
44
+ ? envContent + `PARTNER_CLIENT_SECRET=${clientSecret}\n`
45
+ : envContent + `\nPARTNER_CLIENT_SECRET=${clientSecret}\n`;
46
+ writeFileSync(envPath, newContent, { mode: 0o600 });
47
+ // Ensure restrictive permissions even if file existed
48
+ if (process.platform !== "win32") {
49
+ chmodSync(envPath, 0o600);
50
+ }
51
+ else {
52
+ // Note: Windows doesn't support Unix file permissions
53
+ console.log(chalk.dim(" Note: On Windows, use NTFS permissions to restrict .env file access"));
54
+ }
55
+ console.log(chalk.green(" ✓ Secret saved to .env (restricted permissions)"));
56
+ // Auto-add .env to .gitignore if not already there
57
+ const gitignorePath = resolve(process.cwd(), ".gitignore");
58
+ if (existsSync(gitignorePath)) {
59
+ const gitignoreContent = readFileSync(gitignorePath, "utf-8");
60
+ if (!gitignoreContent.includes(".env")) {
61
+ writeFileSync(gitignorePath, gitignoreContent.trimEnd() + "\n.env\n");
62
+ console.log(chalk.green(" ✓ Added .env to .gitignore"));
63
+ }
64
+ }
65
+ else {
66
+ writeFileSync(gitignorePath, ".env\n");
67
+ console.log(chalk.green(" ✓ Created .gitignore with .env"));
68
+ }
69
+ return {
70
+ partnerClientSecret: clientSecret,
71
+ clientSecretCreated: true,
72
+ };
73
+ }
74
+ }
75
+ export function writeInitConfigFile(configPath, partnerTenantId, partnerClientId, sourceEnvironmentUrl, tenants) {
76
+ const configDir = dirname(configPath);
77
+ if (!existsSync(configDir)) {
78
+ mkdirSync(configDir, { recursive: true });
79
+ }
80
+ // Generate tenant entries
81
+ let tenantsYaml = "";
82
+ if (tenants.length > 0) {
83
+ for (const t of tenants) {
84
+ tenantsYaml += `
85
+ - tenantId: "${t.tenantId}"
86
+ name: "${t.name}"
87
+ environmentUrl: "${t.environmentUrl}"
88
+ enabled: true
89
+ tags:
90
+ - production`;
91
+ }
92
+ }
93
+ const sourceYaml = sourceEnvironmentUrl
94
+ ? `source:
95
+ tenantId: "${partnerTenantId}"
96
+ environmentUrl: "${sourceEnvironmentUrl}"`
97
+ : `# Source environment (where you develop agents)
98
+ # source:
99
+ # tenantId: "${partnerTenantId}"
100
+ # environmentUrl: "https://your-dev-org.crm.dynamics.com"`;
101
+ const configContent = `# Pax8 CTA Configuration File
102
+ # Generated by: pax8-cta init
103
+
104
+ # Partner/MSP Credentials (Azure AD App Registration)
105
+ partner:
106
+ tenantId: "${partnerTenantId}"
107
+ clientId: "${partnerClientId}"
108
+
109
+ ${sourceYaml}
110
+
111
+ # Target tenants (where agents will be deployed)
112
+ # Add tenants here or re-run 'pax8-cta init' to discover them via GDAP
113
+ tenants:${tenantsYaml || " []"}
114
+ # Example:
115
+ # - tenantId: "customer-tenant-guid"
116
+ # name: "Contoso"
117
+ # environmentUrl: "https://contoso.crm.dynamics.com"
118
+ # enabled: true
119
+ `;
120
+ writeFileSync(configPath, configContent);
121
+ console.log(chalk.green(` ✓ Configuration saved to ${configPath}`));
122
+ }
123
+ //# sourceMappingURL=init-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-config.js","sourceRoot":"","sources":["../../src/commands/init-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
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
+ * Show a live summary of the user's environment after init completes.
18
+ * Queries source for solutions, checks tenant health, and shows drift status.
19
+ */
20
+ export declare function showEnvironmentSummary(partnerTenantId: string, partnerClientId: string, clientSecret: string, sourceEnvironmentUrl: string, tenants: Array<{
21
+ tenantId: string;
22
+ name: string;
23
+ environmentUrl: string;
24
+ }>): Promise<void>;
25
+ /**
26
+ * Test credentials and optionally discover GDAP relationships
27
+ */
28
+ export declare function testCredentialsAndGdap(partnerTenantId: string, partnerClientId: string, clientSecret: string, configuredTenants: Array<{
29
+ tenantId: string;
30
+ name: string;
31
+ environmentUrl: string;
32
+ }>): Promise<void>;
33
+ export interface DiscoveredEnvironment {
34
+ displayName: string;
35
+ type: string;
36
+ instanceUrl: string;
37
+ }
38
+ export interface DiscoveredTenant {
39
+ tenantId: string;
40
+ name: string;
41
+ environments: DiscoveredEnvironment[];
42
+ }
43
+ /**
44
+ * Discover customer tenants via GDAP and their Power Platform environments
45
+ */
46
+ export declare function discoverGdapTenantsWithEnvironments(partnerTenantId: string, partnerClientId: string, clientSecret: string): Promise<DiscoveredTenant[]>;
47
+ //# sourceMappingURL=init-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-validation.d.ts","sourceRoot":"","sources":["../../src/commands/init-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,oBAAoB,EAAE,MAAM,EAC5B,OAAO,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,CAoJf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,GACnF,OAAO,CAAC,IAAI,CAAC,CAuIf;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,wBAAsB,mCAAmC,CACvD,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+F7B"}