crewly 1.20.133 → 1.20.134

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 (219) hide show
  1. package/dist/backend/backend/src/constants.d.ts +82 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +87 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts +44 -0
  6. package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts.map +1 -0
  7. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +122 -0
  8. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -0
  9. package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts +25 -0
  10. package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts.map +1 -0
  11. package/dist/backend/backend/src/controllers/bundle/bundle.routes.js +33 -0
  12. package/dist/backend/backend/src/controllers/bundle/bundle.routes.js.map +1 -0
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +14 -0
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  17. package/dist/backend/backend/src/routes/api.routes.js +4 -0
  18. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  19. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts +62 -0
  20. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts.map +1 -0
  21. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js +173 -0
  22. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js.map +1 -0
  23. package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
  24. package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
  25. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +888 -0
  26. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
  27. package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
  28. package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
  29. package/dist/backend/backend/src/services/bundle/bundle-catalog.js +248 -0
  30. package/dist/backend/backend/src/services/bundle/bundle-catalog.js.map +1 -0
  31. package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts +43 -0
  32. package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts.map +1 -0
  33. package/dist/backend/backend/src/services/bundle/bundle-connectors.js +57 -0
  34. package/dist/backend/backend/src/services/bundle/bundle-connectors.js.map +1 -0
  35. package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts +37 -0
  36. package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
  37. package/dist/backend/backend/src/services/bundle/bundle-deps.js +60 -0
  38. package/dist/backend/backend/src/services/bundle/bundle-deps.js.map +1 -0
  39. package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
  40. package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
  41. package/dist/backend/backend/src/services/bundle/bundle-manifest.js +532 -0
  42. package/dist/backend/backend/src/services/bundle/bundle-manifest.js.map +1 -0
  43. package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
  44. package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
  45. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +183 -0
  46. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
  47. package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
  48. package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/bundle/bundle-runtime.js +38 -0
  50. package/dist/backend/backend/src/services/bundle/bundle-runtime.js.map +1 -0
  51. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
  52. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js +144 -0
  54. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
  55. package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
  56. package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/bundle/bundle-state.store.js +90 -0
  58. package/dist/backend/backend/src/services/bundle/bundle-state.store.js.map +1 -0
  59. package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
  60. package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/bundle/bundle-team.builder.js +172 -0
  62. package/dist/backend/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
  63. package/dist/backend/backend/src/services/bundle/bundle-time.d.ts +59 -0
  64. package/dist/backend/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/bundle/bundle-time.js +98 -0
  66. package/dist/backend/backend/src/services/bundle/bundle-time.js.map +1 -0
  67. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
  69. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/core/storage.service.js +1 -1
  71. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/core/teams-backup.service.js +4 -2
  74. package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +2 -0
  77. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -1
  78. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
  79. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
  81. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
  83. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +85 -0
  85. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  86. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/template/template.service.js +5 -2
  88. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/workflow/cron-task.service.js +4 -2
  91. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  92. package/dist/backend/backend/src/types/solution-bundle.types.d.ts +367 -0
  93. package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -0
  94. package/dist/backend/backend/src/types/solution-bundle.types.js +17 -0
  95. package/dist/backend/backend/src/types/solution-bundle.types.js.map +1 -0
  96. package/dist/backend/backend/src/types/team-template.types.d.ts +8 -0
  97. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  98. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  99. package/dist/backend/build-info.json +2 -2
  100. package/dist/cli/backend/src/constants.d.ts +82 -0
  101. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  102. package/dist/cli/backend/src/constants.js +87 -0
  103. package/dist/cli/backend/src/constants.js.map +1 -1
  104. package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
  105. package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
  106. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +888 -0
  107. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
  108. package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
  109. package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
  110. package/dist/cli/backend/src/services/bundle/bundle-catalog.js +248 -0
  111. package/dist/cli/backend/src/services/bundle/bundle-catalog.js.map +1 -0
  112. package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts +37 -0
  113. package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
  114. package/dist/cli/backend/src/services/bundle/bundle-deps.js +60 -0
  115. package/dist/cli/backend/src/services/bundle/bundle-deps.js.map +1 -0
  116. package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
  117. package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
  118. package/dist/cli/backend/src/services/bundle/bundle-manifest.js +532 -0
  119. package/dist/cli/backend/src/services/bundle/bundle-manifest.js.map +1 -0
  120. package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
  121. package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
  122. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +183 -0
  123. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
  124. package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
  125. package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
  126. package/dist/cli/backend/src/services/bundle/bundle-runtime.js +38 -0
  127. package/dist/cli/backend/src/services/bundle/bundle-runtime.js.map +1 -0
  128. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
  129. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
  130. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js +144 -0
  131. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
  132. package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
  133. package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
  134. package/dist/cli/backend/src/services/bundle/bundle-state.store.js +90 -0
  135. package/dist/cli/backend/src/services/bundle/bundle-state.store.js.map +1 -0
  136. package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
  137. package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
  138. package/dist/cli/backend/src/services/bundle/bundle-team.builder.js +172 -0
  139. package/dist/cli/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
  140. package/dist/cli/backend/src/services/bundle/bundle-time.d.ts +59 -0
  141. package/dist/cli/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
  142. package/dist/cli/backend/src/services/bundle/bundle-time.js +98 -0
  143. package/dist/cli/backend/src/services/bundle/bundle-time.js.map +1 -0
  144. package/dist/cli/backend/src/services/core/storage.service.js +1 -1
  145. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  146. package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
  147. package/dist/cli/backend/src/services/core/teams-backup.service.js +4 -2
  148. package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -1
  149. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +72 -0
  150. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
  151. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +389 -0
  152. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
  153. package/dist/cli/backend/src/services/messaging/index.d.ts +15 -0
  154. package/dist/cli/backend/src/services/messaging/index.d.ts.map +1 -0
  155. package/dist/cli/backend/src/services/messaging/index.js +20 -0
  156. package/dist/cli/backend/src/services/messaging/index.js.map +1 -0
  157. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +224 -0
  158. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
  159. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +969 -0
  160. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -0
  161. package/dist/cli/backend/src/services/messaging/response-router.service.d.ts +110 -0
  162. package/dist/cli/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
  163. package/dist/cli/backend/src/services/messaging/response-router.service.js +268 -0
  164. package/dist/cli/backend/src/services/messaging/response-router.service.js.map +1 -0
  165. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
  166. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
  167. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
  168. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  169. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +133 -0
  170. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +232 -0
  172. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -0
  173. package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts +277 -0
  174. package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
  175. package/dist/cli/backend/src/services/skill/skill-catalog.service.js +708 -0
  176. package/dist/cli/backend/src/services/skill/skill-catalog.service.js.map +1 -0
  177. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
  178. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
  179. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
  180. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
  181. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
  182. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  183. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +85 -0
  184. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  185. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
  186. package/dist/cli/backend/src/services/template/template.service.js +5 -2
  187. package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
  188. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +316 -0
  189. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
  190. package/dist/cli/backend/src/services/workflow/cron-task.service.js +1043 -0
  191. package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -0
  192. package/dist/cli/backend/src/types/cron-task.types.d.ts +95 -0
  193. package/dist/cli/backend/src/types/cron-task.types.d.ts.map +1 -0
  194. package/dist/cli/backend/src/types/cron-task.types.js +10 -0
  195. package/dist/cli/backend/src/types/cron-task.types.js.map +1 -0
  196. package/dist/cli/backend/src/types/solution-bundle.types.d.ts +367 -0
  197. package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -0
  198. package/dist/cli/backend/src/types/solution-bundle.types.js +17 -0
  199. package/dist/cli/backend/src/types/solution-bundle.types.js.map +1 -0
  200. package/dist/cli/backend/src/types/team-template.types.d.ts +8 -0
  201. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  202. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  203. package/dist/cli/cli/src/commands/deploy-bundle.d.ts +160 -0
  204. package/dist/cli/cli/src/commands/deploy-bundle.d.ts.map +1 -0
  205. package/dist/cli/cli/src/commands/deploy-bundle.js +386 -0
  206. package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -0
  207. package/dist/cli/cli/src/commands/onboard.d.ts +32 -1
  208. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  209. package/dist/cli/cli/src/commands/onboard.js +80 -3
  210. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  211. package/dist/cli/cli/src/constants.d.ts +5 -0
  212. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  213. package/dist/cli/cli/src/constants.js +5 -0
  214. package/dist/cli/cli/src/constants.js.map +1 -1
  215. package/dist/cli/cli/src/index.js +15 -0
  216. package/dist/cli/cli/src/index.js.map +1 -1
  217. package/frontend/dist/assets/{index-e6c403b6.js → index-97bb17d4.js} +274 -274
  218. package/frontend/dist/index.html +1 -1
  219. package/package.json +1 -1
@@ -0,0 +1,160 @@
1
+ /**
2
+ * CLI: deploy a solution bundle (specs/solution-bundles.md).
3
+ *
4
+ * crewly deploy-bundle <template-id> --answers answers.json [--runtime crewly-agent]
5
+ * [--templates-dir <dir>] [--dry-run] [--allow-draft] [--json]
6
+ *
7
+ * Scripted deploys (hosted servers run it from cloud-init) and
8
+ * `crewly onboard --template <bundle>` both come here. When this user's
9
+ * backend is running, the deploy goes through `POST /api/bundles/apply` and
10
+ * the job is followed until it finishes, so Slack, connector checks and the
11
+ * first-week hand-offs happen right away. Otherwise the same engine runs
12
+ * in-process: the team, norms, SOPs, skills and schedules are written, and
13
+ * the steps that need a running Crewly are left pending — the backend
14
+ * finishes them when it starts.
15
+ *
16
+ * @module cli/commands/deploy-bundle
17
+ */
18
+ import { BundleCatalog } from '../../../backend/src/services/bundle/bundle-catalog.js';
19
+ import type { BundleDeployment, BundleQuestion } from '../../../backend/src/types/solution-bundle.types.js';
20
+ import { type HttpJson } from '../utils/harness-engine.js';
21
+ /** Output function. */
22
+ type Log = (line: string) => void;
23
+ /** Command options (Commander). */
24
+ export interface DeployBundleOptions {
25
+ /** JSON file with `{ "<question id>": "<answer>" }` */
26
+ answers?: string;
27
+ /** Runtime for every member (default: recommended if this machine can run it, else the orchestrator's) */
28
+ runtime?: string;
29
+ /** Extra template directories (repeatable), e.g. crewly-pro/config/templates */
30
+ templatesDir?: string[];
31
+ /** Validate and print the plan without deploying */
32
+ dryRun?: boolean;
33
+ /** Deploy a bundle marked `draft` */
34
+ allowDraft?: boolean;
35
+ /** Print the final deployment as JSON */
36
+ json?: boolean;
37
+ }
38
+ /** A deploy target: the running backend or the in-process engine. */
39
+ export interface BundleDeployTarget {
40
+ readonly where: 'backend' | 'in-process';
41
+ start(request: {
42
+ templateId: string;
43
+ answers?: unknown;
44
+ runtime?: string;
45
+ allowDraft?: boolean;
46
+ }): Promise<BundleDeployment>;
47
+ getJob(jobId: string): Promise<BundleDeployment>;
48
+ /** In-process only: wait for the run started by `start` */
49
+ wait?(request: {
50
+ templateId: string;
51
+ answers?: unknown;
52
+ runtime?: string;
53
+ allowDraft?: boolean;
54
+ }): Promise<BundleDeployment>;
55
+ }
56
+ /** Injectable pieces (tests). */
57
+ export interface DeployBundleDeps {
58
+ log?: Log;
59
+ readFile?: (file: string) => string;
60
+ /** Catalog used to validate before deploying */
61
+ catalog?: Pick<BundleCatalog, 'get'>;
62
+ /** Whether this user's backend is running */
63
+ isRunning?: () => Promise<boolean>;
64
+ /** Target when the backend is running */
65
+ remote?: () => BundleDeployTarget;
66
+ /** Target when it is not */
67
+ local?: (templateDirs: string[]) => BundleDeployTarget | Promise<BundleDeployTarget>;
68
+ sleep?: (ms: number) => Promise<void>;
69
+ /** Clock for the poll timeout */
70
+ now?: () => number;
71
+ }
72
+ /**
73
+ * The Crewly package root the CLI runs from.
74
+ *
75
+ * @returns Absolute path (parent of `config/templates`)
76
+ */
77
+ export declare function cliPackageRoot(): string;
78
+ /**
79
+ * Read a JSON answers file.
80
+ *
81
+ * @param file - Path
82
+ * @param readFile - File reader
83
+ * @returns Answers object
84
+ * @throws Error with an owner-readable message when missing or not a JSON object
85
+ */
86
+ export declare function loadAnswersFile(file: string, readFile?: (f: string) => string): Record<string, unknown>;
87
+ /**
88
+ * An answers-file skeleton for a bundle (printed when answers are missing).
89
+ *
90
+ * @param questions - Bundle questions
91
+ * @returns Pretty JSON with every question id
92
+ */
93
+ export declare function answersSkeleton(questions: BundleQuestion[]): string;
94
+ /**
95
+ * The running backend as a deploy target.
96
+ *
97
+ * @param baseUrl - Loopback URL
98
+ * @param http - HTTP helper
99
+ * @returns Target
100
+ */
101
+ export declare function createRemoteTarget(baseUrl?: string, http?: HttpJson): BundleDeployTarget;
102
+ /**
103
+ * The in-process engine as a deploy target (no Slack, connector checks or
104
+ * orchestrator: those steps stay pending until the backend starts).
105
+ *
106
+ * Loaded lazily: the engine's collaborators pull in the marketplace
107
+ * installer and the harness store, which `crewly onboard` / `crewly doctor`
108
+ * should not load unless a bundle is actually deployed.
109
+ *
110
+ * @param templateDirs - Extra template directories
111
+ * @returns Target
112
+ */
113
+ export declare function createLocalTarget(templateDirs: string[]): Promise<BundleDeployTarget>;
114
+ /**
115
+ * Human-readable lines for a deployment.
116
+ *
117
+ * @param deployment - Deployment
118
+ * @returns Lines (no trailing newline)
119
+ */
120
+ export declare function formatDeployment(deployment: BundleDeployment): string[];
121
+ /**
122
+ * Whether a finished deployment should fail the command.
123
+ *
124
+ * @param deployment - Deployment
125
+ * @returns True when the team failed or any step failed
126
+ */
127
+ export declare function deploymentFailed(deployment: BundleDeployment): boolean;
128
+ /**
129
+ * Deploy a bundle (shared by `crewly deploy-bundle` and `crewly onboard`).
130
+ *
131
+ * @param templateId - Bundle template id
132
+ * @param options - Answers (object or file), runtime, flags
133
+ * @param deps - Injectable pieces
134
+ * @returns Process exit code (0 = deployed, possibly with pending steps; 1 = refused or failed)
135
+ */
136
+ export declare function deployBundle(templateId: string, options: Omit<DeployBundleOptions, 'answers'> & {
137
+ answers?: Record<string, unknown>;
138
+ }, deps?: DeployBundleDeps): Promise<number>;
139
+ /**
140
+ * `crewly deploy-bundle <id>` action.
141
+ *
142
+ * @param templateId - Bundle template id
143
+ * @param options - Commander options
144
+ * @param deps - Injectable pieces
145
+ */
146
+ export declare function deployBundleCommand(templateId: string, options?: DeployBundleOptions, deps?: DeployBundleDeps): Promise<void>;
147
+ /**
148
+ * Ask a bundle's questions in the terminal. An answer from `preset` is
149
+ * kept; Enter takes the default; a select takes a number or a value; a
150
+ * multiselect takes comma-separated numbers or values.
151
+ *
152
+ * @param ask - Prompt function
153
+ * @param questions - Bundle questions
154
+ * @param preset - Answers already given (e.g. from --answers)
155
+ * @param log - Output
156
+ * @returns Answers
157
+ */
158
+ export declare function askBundleQuestions(ask: (question: string) => Promise<string>, questions: BundleQuestion[], preset?: Record<string, unknown>, log?: Log): Promise<Record<string, unknown>>;
159
+ export {};
160
+ //# sourceMappingURL=deploy-bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-bundle.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/deploy-bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,386 @@
1
+ /**
2
+ * CLI: deploy a solution bundle (specs/solution-bundles.md).
3
+ *
4
+ * crewly deploy-bundle <template-id> --answers answers.json [--runtime crewly-agent]
5
+ * [--templates-dir <dir>] [--dry-run] [--allow-draft] [--json]
6
+ *
7
+ * Scripted deploys (hosted servers run it from cloud-init) and
8
+ * `crewly onboard --template <bundle>` both come here. When this user's
9
+ * backend is running, the deploy goes through `POST /api/bundles/apply` and
10
+ * the job is followed until it finishes, so Slack, connector checks and the
11
+ * first-week hand-offs happen right away. Otherwise the same engine runs
12
+ * in-process: the team, norms, SOPs, skills and schedules are written, and
13
+ * the steps that need a running Crewly are left pending — the backend
14
+ * finishes them when it starts.
15
+ *
16
+ * @module cli/commands/deploy-bundle
17
+ */
18
+ import { readFileSync } from 'fs';
19
+ import * as path from 'path';
20
+ import chalk from 'chalk';
21
+ import { BUNDLE_CONSTANTS } from '../../../backend/src/constants.js';
22
+ import { getCrewlyHomePath } from '../../../backend/src/services/core/crewly-home.utils.js';
23
+ import { BundleApplyService, BundleError } from '../../../backend/src/services/bundle/bundle-apply.service.js';
24
+ import { BundleCatalog, bundleTemplateDirs, toBundleDetail } from '../../../backend/src/services/bundle/bundle-catalog.js';
25
+ import { BundleAnswersError, resolveAnswers } from '../../../backend/src/services/bundle/bundle-placeholders.js';
26
+ import { CLI_CONSTANTS } from '../constants.js';
27
+ import { defaultHttpJson, isBackendRunning, localBackendUrl } from '../utils/harness-engine.js';
28
+ import { getTemplatesDir } from '../utils/templates.js';
29
+ /**
30
+ * The Crewly package root the CLI runs from.
31
+ *
32
+ * @returns Absolute path (parent of `config/templates`)
33
+ */
34
+ export function cliPackageRoot() {
35
+ return path.dirname(path.dirname(getTemplatesDir()));
36
+ }
37
+ /**
38
+ * Read a JSON answers file.
39
+ *
40
+ * @param file - Path
41
+ * @param readFile - File reader
42
+ * @returns Answers object
43
+ * @throws Error with an owner-readable message when missing or not a JSON object
44
+ */
45
+ export function loadAnswersFile(file, readFile = (f) => readFileSync(f, 'utf-8')) {
46
+ let text;
47
+ try {
48
+ text = readFile(file);
49
+ }
50
+ catch {
51
+ throw new Error(`Cannot read the answers file: ${file}`);
52
+ }
53
+ let parsed;
54
+ try {
55
+ parsed = JSON.parse(text);
56
+ }
57
+ catch (error) {
58
+ throw new Error(`The answers file is not valid JSON (${file}): ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
61
+ throw new Error(`The answers file must be a JSON object like {"business_name": "…"} (${file})`);
62
+ }
63
+ return parsed;
64
+ }
65
+ /**
66
+ * An answers-file skeleton for a bundle (printed when answers are missing).
67
+ *
68
+ * @param questions - Bundle questions
69
+ * @returns Pretty JSON with every question id
70
+ */
71
+ export function answersSkeleton(questions) {
72
+ const skeleton = {};
73
+ for (const q of questions) {
74
+ skeleton[q.id] = q.type === 'multiselect' ? (Array.isArray(q.default) ? q.default : []) : typeof q.default === 'string' ? q.default : '';
75
+ }
76
+ return JSON.stringify(skeleton, null, 2);
77
+ }
78
+ /**
79
+ * The running backend as a deploy target.
80
+ *
81
+ * @param baseUrl - Loopback URL
82
+ * @param http - HTTP helper
83
+ * @returns Target
84
+ */
85
+ export function createRemoteTarget(baseUrl = localBackendUrl(), http = defaultHttpJson) {
86
+ /** Unwrap `{ success, data }`, turning errors into BundleError-like errors. */
87
+ const unwrap = (status, body) => {
88
+ const b = body;
89
+ if (status < 300 && b?.success && b.data !== undefined)
90
+ return b.data;
91
+ const code = (b?.code ?? 'unknown_bundle');
92
+ const details = Array.isArray(b?.missing) || Array.isArray(b?.invalid)
93
+ ? { missing: (b?.missing ?? []), invalid: (b?.invalid ?? []) }
94
+ : undefined;
95
+ throw new BundleError(code, b?.error ?? `HTTP ${status}`, details);
96
+ };
97
+ return {
98
+ where: 'backend',
99
+ async start(request) {
100
+ const { status, body } = await http('POST', `${baseUrl}${CLI_CONSTANTS.BUNDLE.APPLY_ENDPOINT}`, request);
101
+ return unwrap(status, body).deployment;
102
+ },
103
+ async getJob(jobId) {
104
+ const { status, body } = await http('GET', `${baseUrl}${CLI_CONSTANTS.BUNDLE.APPLY_ENDPOINT}/${encodeURIComponent(jobId)}`);
105
+ return unwrap(status, body);
106
+ },
107
+ };
108
+ }
109
+ /**
110
+ * The in-process engine as a deploy target (no Slack, connector checks or
111
+ * orchestrator: those steps stay pending until the backend starts).
112
+ *
113
+ * Loaded lazily: the engine's collaborators pull in the marketplace
114
+ * installer and the harness store, which `crewly onboard` / `crewly doctor`
115
+ * should not load unless a bundle is actually deployed.
116
+ *
117
+ * @param templateDirs - Extra template directories
118
+ * @returns Target
119
+ */
120
+ export async function createLocalTarget(templateDirs) {
121
+ const [{ createBaseBundleDeps }, { OrcHarnessStore }] = await Promise.all([
122
+ import('../../../backend/src/services/bundle/bundle-deps.js'),
123
+ import('../../../backend/src/services/harness/orc-harness.store.js'),
124
+ ]);
125
+ const store = new OrcHarnessStore();
126
+ const service = new BundleApplyService(createBaseBundleDeps({
127
+ crewlyHome: getCrewlyHomePath(),
128
+ packageRoot: cliPackageRoot(),
129
+ extraTemplateDirs: templateDirs,
130
+ getOrcHarness: () => store.get(),
131
+ }));
132
+ return {
133
+ where: 'in-process',
134
+ start: (request) => service.start(request),
135
+ getJob: (jobId) => service.getJob(jobId),
136
+ wait: (request) => service.applyAndWait(request),
137
+ };
138
+ }
139
+ /** Status marks for the step list. */
140
+ const STEP_MARKS = {
141
+ done: chalk.green('✓'),
142
+ skipped: chalk.gray('–'),
143
+ pending: chalk.yellow('…'),
144
+ failed: chalk.red('✗'),
145
+ running: chalk.cyan('→'),
146
+ queued: chalk.gray('·'),
147
+ };
148
+ /**
149
+ * Human-readable lines for a deployment.
150
+ *
151
+ * @param deployment - Deployment
152
+ * @returns Lines (no trailing newline)
153
+ */
154
+ export function formatDeployment(deployment) {
155
+ const lines = [];
156
+ for (const step of deployment.steps) {
157
+ const detail = step.error ?? step.message ?? '';
158
+ lines.push(` ${STEP_MARKS[step.status] ?? '·'} ${step.label}${detail ? chalk.gray(` — ${detail}`) : ''}`);
159
+ for (const item of step.items ?? []) {
160
+ if (item.status === 'done' && step.status === 'done')
161
+ continue;
162
+ lines.push(chalk.gray(` ${STEP_MARKS[item.status] ?? '·'} ${item.label}${item.message ? `: ${item.message}` : ''}`));
163
+ }
164
+ }
165
+ const missing = deployment.connectors.filter((c) => c.status !== 'connected');
166
+ if (missing.length > 0) {
167
+ lines.push('');
168
+ lines.push(chalk.bold(' Connect these (on the Connections page, works from a phone):'));
169
+ for (const c of missing) {
170
+ lines.push(` ${c.required ? '•' : '◦'} ${c.id}${c.products.length ? ` (${c.products.join(', ')})` : ''} — ${c.why} → ${c.connectPath}`);
171
+ }
172
+ }
173
+ return lines;
174
+ }
175
+ /**
176
+ * Whether a finished deployment should fail the command.
177
+ *
178
+ * @param deployment - Deployment
179
+ * @returns True when the team failed or any step failed
180
+ */
181
+ export function deploymentFailed(deployment) {
182
+ return deployment.status === 'failed' || deployment.steps.some((s) => s.status === 'failed');
183
+ }
184
+ /**
185
+ * Explain a refused deploy.
186
+ *
187
+ * @param error - BundleError
188
+ * @param template - The bundle (for the answers skeleton), if known
189
+ * @param log - Output
190
+ */
191
+ function reportBundleError(error, template, log) {
192
+ log(chalk.red(` ✗ ${error.message}`));
193
+ if (error.code === 'invalid_answers' && template) {
194
+ log(chalk.gray(' Answers file template (fill in and pass with --answers):'));
195
+ for (const line of answersSkeleton(template.bundle.questions ?? []).split('\n'))
196
+ log(chalk.gray(` ${line}`));
197
+ }
198
+ }
199
+ /**
200
+ * Deploy a bundle (shared by `crewly deploy-bundle` and `crewly onboard`).
201
+ *
202
+ * @param templateId - Bundle template id
203
+ * @param options - Answers (object or file), runtime, flags
204
+ * @param deps - Injectable pieces
205
+ * @returns Process exit code (0 = deployed, possibly with pending steps; 1 = refused or failed)
206
+ */
207
+ export async function deployBundle(templateId, options, deps = {}) {
208
+ const log = deps.log ?? ((line) => console.log(line));
209
+ const templateDirs = (options.templatesDir ?? []).map((d) => path.resolve(d));
210
+ const catalog = deps.catalog ?? new BundleCatalog(() => bundleTemplateDirs(cliPackageRoot(), templateDirs));
211
+ const entry = catalog.get(templateId);
212
+ const template = entry?.template ?? null;
213
+ // Validate locally first for a clear message (the backend checks again).
214
+ // A dry run without answers only validates the template itself.
215
+ if (template && !(options.dryRun && !options.answers)) {
216
+ try {
217
+ resolveAnswers(template.bundle.questions ?? [], options.answers ?? {});
218
+ }
219
+ catch (error) {
220
+ if (error instanceof BundleAnswersError) {
221
+ reportBundleError(new BundleError('invalid_answers', error.message), template, log);
222
+ return CLI_CONSTANTS.EXIT_CODES.ERROR;
223
+ }
224
+ throw error;
225
+ }
226
+ }
227
+ if (options.dryRun) {
228
+ if (!template) {
229
+ log(chalk.red(` ✗ No bundle "${templateId}" in ${bundleTemplateDirs(cliPackageRoot(), templateDirs).join(', ')}`));
230
+ return CLI_CONSTANTS.EXIT_CODES.ERROR;
231
+ }
232
+ const detail = toBundleDetail(template);
233
+ log(chalk.bold(` ${detail.label} (${detail.id}) — ${detail.status}`));
234
+ log(` ${detail.tagline}`);
235
+ for (const team of detail.teams)
236
+ log(` Team ${team.name}: ${team.members.map((m) => `${m.name} (${m.title})`).join(', ')}`);
237
+ log(` Runtime: ${detail.recommendedRuntime} · Server: ${detail.serverTier}`);
238
+ log(` Skills: ${detail.skills.join(', ') || '—'}`);
239
+ log(` Connectors: ${detail.connectors.map((c) => c.id).join(', ') || '—'}`);
240
+ log(` Schedules: ${detail.schedules.map((s) => `${s.title} (${s.cron})`).join(', ') || '—'}`);
241
+ log(` First week: ${detail.firstWeek.map((t) => `day ${t.day + 1} ${t.title}`).join(', ') || '—'}`);
242
+ log(chalk.green(' ✓ Valid. Nothing was deployed (--dry-run).'));
243
+ return CLI_CONSTANTS.EXIT_CODES.SUCCESS;
244
+ }
245
+ const running = await (deps.isRunning ?? (() => isBackendRunning()))();
246
+ const target = running ? (deps.remote ?? (() => createRemoteTarget()))() : await (deps.local ?? createLocalTarget)(templateDirs);
247
+ if (running && templateDirs.length > 0) {
248
+ log(chalk.yellow(' ⚠ Crewly is running: --templates-dir is not seen by it. Start it with CREWLY_TEMPLATE_DIRS set instead.'));
249
+ }
250
+ const request = {
251
+ templateId,
252
+ ...(options.answers ? { answers: options.answers } : {}),
253
+ ...(options.runtime ? { runtime: options.runtime } : {}),
254
+ ...(options.allowDraft ? { allowDraft: true } : {}),
255
+ };
256
+ log(chalk.blue(` Deploying ${template?.bundle.label ?? templateId} ${running ? 'through the running Crewly' : '(Crewly is not running; finishing the rest when it starts)'}…`));
257
+ let final;
258
+ try {
259
+ if (target.wait) {
260
+ final = await target.wait(request);
261
+ }
262
+ else {
263
+ const started = await target.start(request);
264
+ const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
265
+ const now = deps.now ?? (() => Date.now());
266
+ const deadline = now() + BUNDLE_CONSTANTS.CLI_JOB_TIMEOUT_MS;
267
+ final = started;
268
+ while (final.status === 'running' && now() < deadline) {
269
+ await sleep(BUNDLE_CONSTANTS.CLI_POLL_INTERVAL_MS);
270
+ final = await target.getJob(started.jobId);
271
+ }
272
+ if (final.status === 'running') {
273
+ log(chalk.yellow(` ⚠ Still running after ${BUNDLE_CONSTANTS.CLI_JOB_TIMEOUT_MS / 60000} min; follow it at /api/bundles/apply/${started.jobId}`));
274
+ }
275
+ }
276
+ }
277
+ catch (error) {
278
+ if (error instanceof BundleError) {
279
+ reportBundleError(error, template, log);
280
+ return CLI_CONSTANTS.EXIT_CODES.ERROR;
281
+ }
282
+ log(chalk.red(` ✗ ${error instanceof Error ? error.message : String(error)}`));
283
+ return CLI_CONSTANTS.EXIT_CODES.ERROR;
284
+ }
285
+ if (options.json) {
286
+ log(JSON.stringify(final, null, 2));
287
+ }
288
+ else {
289
+ for (const line of formatDeployment(final))
290
+ log(line);
291
+ log('');
292
+ if (final.status === 'done')
293
+ log(chalk.green(' ✓ Deployed.'));
294
+ else if (!deploymentFailed(final))
295
+ log(chalk.green(' ✓ Deployed; the steps marked … finish by themselves once they can.'));
296
+ else
297
+ log(chalk.red(' ✗ Some steps failed. Run the same command again to retry them; finished steps are kept.'));
298
+ }
299
+ return deploymentFailed(final) ? CLI_CONSTANTS.EXIT_CODES.ERROR : CLI_CONSTANTS.EXIT_CODES.SUCCESS;
300
+ }
301
+ /**
302
+ * `crewly deploy-bundle <id>` action.
303
+ *
304
+ * @param templateId - Bundle template id
305
+ * @param options - Commander options
306
+ * @param deps - Injectable pieces
307
+ */
308
+ export async function deployBundleCommand(templateId, options = {}, deps = {}) {
309
+ const log = deps.log ?? ((line) => console.log(line));
310
+ let answers;
311
+ if (options.answers) {
312
+ try {
313
+ answers = loadAnswersFile(options.answers, deps.readFile);
314
+ }
315
+ catch (error) {
316
+ log(chalk.red(` ✗ ${error instanceof Error ? error.message : String(error)}`));
317
+ process.exitCode = CLI_CONSTANTS.EXIT_CODES.ERROR;
318
+ return;
319
+ }
320
+ }
321
+ const code = await deployBundle(templateId, { ...options, answers }, deps);
322
+ if (code !== CLI_CONSTANTS.EXIT_CODES.SUCCESS)
323
+ process.exitCode = code;
324
+ }
325
+ /**
326
+ * Ask a bundle's questions in the terminal. An answer from `preset` is
327
+ * kept; Enter takes the default; a select takes a number or a value; a
328
+ * multiselect takes comma-separated numbers or values.
329
+ *
330
+ * @param ask - Prompt function
331
+ * @param questions - Bundle questions
332
+ * @param preset - Answers already given (e.g. from --answers)
333
+ * @param log - Output
334
+ * @returns Answers
335
+ */
336
+ export async function askBundleQuestions(ask, questions, preset = {}, log = (line) => console.log(line)) {
337
+ const answers = { ...preset };
338
+ for (const q of questions) {
339
+ if (answers[q.id] !== undefined && answers[q.id] !== '')
340
+ continue;
341
+ const options = q.options ?? [];
342
+ for (;;) {
343
+ log(chalk.bold(` ${q.label}${q.required ? '' : chalk.gray('(可选)')}`));
344
+ if (q.help)
345
+ log(chalk.gray(` ${q.help}`));
346
+ options.forEach((o, i) => log(` ${i + 1}. ${o.label ?? o.value}`));
347
+ const fallback = Array.isArray(q.default) ? q.default.join(', ') : q.default ?? '';
348
+ const raw = (await ask(` > ${fallback ? chalk.gray(`[${fallback}] `) : ''}`)).trim();
349
+ if (raw === '') {
350
+ if (q.required) {
351
+ log(chalk.yellow(' 这一项必填。'));
352
+ continue;
353
+ }
354
+ break; // default applies
355
+ }
356
+ const pick = (token) => {
357
+ const n = Number.parseInt(token, 10);
358
+ if (String(n) === token && n >= 1 && n <= options.length)
359
+ return options[n - 1].value;
360
+ return options.some((o) => o.value === token) ? token : null;
361
+ };
362
+ if (q.type === 'select') {
363
+ const value = pick(raw);
364
+ if (!value) {
365
+ log(chalk.yellow(` 请输入 1-${options.length}。`));
366
+ continue;
367
+ }
368
+ answers[q.id] = value;
369
+ }
370
+ else if (q.type === 'multiselect') {
371
+ const values = raw.split(/[,,、\s]+/).filter(Boolean).map(pick);
372
+ if (values.some((v) => v === null)) {
373
+ log(chalk.yellow(` 用逗号分开,比如 1,3。`));
374
+ continue;
375
+ }
376
+ answers[q.id] = values;
377
+ }
378
+ else {
379
+ answers[q.id] = raw;
380
+ }
381
+ break;
382
+ }
383
+ }
384
+ return answers;
385
+ }
386
+ //# sourceMappingURL=deploy-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-bundle.js","sourceRoot":"","sources":["../../../../../cli/src/commands/deploy-bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,8DAA8D,CAAC;AAC/G,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,wDAAwD,CAAC;AAC3H,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAEjH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAiB,MAAM,4BAA4B,CAAC;AAC/G,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA+CxD;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,WAAkC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IAC7G,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,uEAAuE,IAAI,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,MAAiC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAA2B;IACzD,MAAM,QAAQ,GAAsC,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3I,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,eAAe,EAAE,EAAE,OAAiB,eAAe;IACtG,+EAA+E;IAC/E,MAAM,MAAM,GAAG,CAAI,MAAc,EAAE,IAAa,EAAK,EAAE;QACrD,MAAM,CAAC,GAAG,IAAmH,CAAC;QAC9H,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;QACtE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,gBAAgB,CAAiD,CAAC;QAC3F,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC;YACpE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAY,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAY,EAAE;YACpF,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,QAAQ,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;YACzG,OAAO,MAAM,CAAmC,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC;QAC3E,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5H,OAAO,MAAM,CAAmB,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,YAAsB;IAC5D,MAAM,CAAC,EAAE,oBAAoB,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxE,MAAM,CAAC,qDAAqD,CAAC;QAC7D,MAAM,CAAC,4DAA4D,CAAC;KACrE,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,kBAAkB,CACpC,oBAAoB,CAAC;QACnB,UAAU,EAAE,iBAAiB,EAAE;QAC/B,WAAW,EAAE,cAAc,EAAE;QAC7B,iBAAiB,EAAE,YAAY;QAC/B,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;KACjC,CAAC,CACH,CAAC;IACF,OAAO;QACL,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACxC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,GAA2B;IACzC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA4B;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3G,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,SAAS;YAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;QACzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7I,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA4B;IAC3D,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,KAAkB,EAAE,QAA+B,EAAE,GAAQ;IACtF,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,QAAQ,EAAE,CAAC;QACjD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;QAChF,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAClH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,OAAqF,EACrF,OAAyB,EAAE;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,aAAa,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,cAAc,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC;IAEzC,yEAAyE;IACzE,gEAAgE;IAChE,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,iBAAiB,CAAC,IAAI,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACpF,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;YACxC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,UAAU,QAAQ,kBAAkB,CAAC,cAAc,EAAE,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpH,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;QACxC,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvE,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAAE,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7H,GAAG,CAAC,cAAc,MAAM,CAAC,kBAAkB,cAAc,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9E,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,iBAAiB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7E,GAAG,CAAC,gBAAgB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/F,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACrG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACjE,OAAO,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC;IACjI,IAAI,OAAO,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2GAA2G,CAAC,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,OAAO,GAAG;QACd,UAAU;QACV,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;IACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,4DAA4D,GAAG,CAAC,CAAC,CAAC;IAEjL,IAAI,KAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,gBAAgB,CAAC,kBAAkB,CAAC;YAC7D,KAAK,GAAG,OAAO,CAAC;YAChB,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;gBACnD,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,gBAAgB,CAAC,kBAAkB,GAAG,KAAK,yCAAyC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACxC,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;QACxC,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;aAC1D,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC,CAAC;;YACvH,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;AACrG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,UAA+B,EAAE,EAAE,OAAyB,EAAE;IAC1H,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,OAA4C,CAAC;IACjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;YAClD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3E,IAAI,IAAI,KAAK,aAAa,CAAC,UAAU,CAAC,OAAO;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AACzE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAA0C,EAC1C,SAA2B,EAC3B,SAAkC,EAAE,EACpC,MAAW,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAEtC,MAAM,OAAO,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE;YAAE,SAAS;QAClE,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAChC,SAAS,CAAC;YACR,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,CAAC,IAAI;gBAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;YACnF,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtF,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACf,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;oBAChC,SAAS;gBACX,CAAC;gBACD,MAAM,CAAC,kBAAkB;YAC3B,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,KAAa,EAAiB,EAAE;gBAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM;oBAAE,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,CAAC,CAAC;YACF,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAClD,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;oBACnC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBACvC,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAkB,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACtB,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -26,7 +26,10 @@
26
26
  *
27
27
  * Used directly via `crewly onboard`, by the curl install script, and by the
28
28
  * desktop app. Flags: `--yes`, `--template <id>`, `--harness <id>`, `--task <text>`,
29
- * `--web`, `--cli`.
29
+ * `--web`, `--cli`, and for a solution bundle (`--template <bundle id>`)
30
+ * `--answers <file>` / `--runtime <id>`: the bundle's questions are asked
31
+ * (or read from the file) and it is deployed in one step
32
+ * (specs/solution-bundles.md).
30
33
  *
31
34
  * @module cli/commands/onboard
32
35
  */
@@ -35,6 +38,7 @@ import { type TeamTemplate } from '../utils/templates.js';
35
38
  import type { HarnessService } from '../../../backend/src/services/harness/harness.service.js';
36
39
  import { type LoginDriver } from '../utils/harness-engine.js';
37
40
  import { type HarnessSetupResult, type SetupIO } from './harness-setup.js';
41
+ import type { BundleTemplate } from '../../../backend/src/types/solution-bundle.types.js';
38
42
  import { type ConnectLinks, type ConnectState, type FirstTaskOutcome, type StarterChoice } from './onboard-checklist.js';
39
43
  /** Options passed from Commander.js for the onboard command */
40
44
  export interface OnboardOptions {
@@ -50,6 +54,10 @@ export interface OnboardOptions {
50
54
  cli?: boolean;
51
55
  /** First task for the new team (with --yes; otherwise it is asked) */
52
56
  task?: string;
57
+ /** Answers file (JSON) for a solution bundle's questions */
58
+ answers?: string;
59
+ /** Runtime for a solution bundle's members */
60
+ runtime?: string;
53
61
  }
54
62
  /** Where the rest of setup happens. */
55
63
  export type SetupMode = 'web' | 'cli';
@@ -71,6 +79,10 @@ export interface OnboardDeps {
71
79
  connectLinks?: () => ConnectLinks;
72
80
  /** Cloud / Slack state from the running backend (null when unknown) */
73
81
  readConnectState?: () => Promise<ConnectState | null>;
82
+ /** Find a solution bundle by template id (null when the id is not a bundle) */
83
+ findBundle?: (templateId: string) => BundleTemplate | null;
84
+ /** Deploy a solution bundle; returns the exit code */
85
+ deployBundle?: (templateId: string, answers: Record<string, unknown>, runtime: string | undefined) => Promise<number>;
74
86
  }
75
87
  /**
76
88
  * Prints the Crewly ASCII art banner to stdout.
@@ -345,6 +357,25 @@ export declare function runConnectStep(links: () => ConnectLinks, readState: ()
345
357
  * @param projectDir - The project directory path for next-steps output
346
358
  */
347
359
  export declare function printSummary(selectedTemplate?: TeamTemplate | null, projectDir?: string): void;
360
+ /**
361
+ * A solution bundle by template id, from the OSS templates and
362
+ * CREWLY_TEMPLATE_DIRS (e.g. Crewly Pro's templates).
363
+ *
364
+ * @param templateId - Template id
365
+ * @returns The bundle, or null when the id is not a bundle
366
+ */
367
+ export declare function findBundleTemplate(templateId: string): BundleTemplate | null;
368
+ /**
369
+ * Step 4 for a solution bundle: its questions (unless `--answers` covers
370
+ * them, or `--yes` forbids asking), then the one-step deploy.
371
+ *
372
+ * @param bundle - Bundle template
373
+ * @param options - `--answers`, `--runtime`
374
+ * @param ask - Prompt function, or null in non-interactive mode
375
+ * @param deploy - Deploy function (exit code)
376
+ * @returns Whether the bundle deployed (possibly with pending steps)
377
+ */
378
+ export declare function runBundleStep(bundle: BundleTemplate, options: Pick<OnboardOptions, 'answers' | 'runtime'>, ask: ((question: string) => Promise<string>) | null, deploy: (templateId: string, answers: Record<string, unknown>, runtime: string | undefined) => Promise<number>): Promise<boolean>;
348
379
  /**
349
380
  * Runs the onboarding wizard.
350
381
  *