@build-astron-co/nimbus 0.2.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 (313) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +628 -0
  3. package/bin/nimbus +38 -0
  4. package/package.json +80 -0
  5. package/src/__tests__/app.test.ts +76 -0
  6. package/src/__tests__/audit.test.ts +877 -0
  7. package/src/__tests__/circuit-breaker.test.ts +116 -0
  8. package/src/__tests__/cli-run.test.ts +115 -0
  9. package/src/__tests__/context-manager.test.ts +502 -0
  10. package/src/__tests__/context.test.ts +242 -0
  11. package/src/__tests__/enterprise.test.ts +401 -0
  12. package/src/__tests__/generator.test.ts +433 -0
  13. package/src/__tests__/hooks.test.ts +582 -0
  14. package/src/__tests__/init.test.ts +436 -0
  15. package/src/__tests__/intent-parser.test.ts +229 -0
  16. package/src/__tests__/llm-router.test.ts +209 -0
  17. package/src/__tests__/lsp.test.ts +293 -0
  18. package/src/__tests__/modes.test.ts +336 -0
  19. package/src/__tests__/permissions.test.ts +338 -0
  20. package/src/__tests__/serve.test.ts +275 -0
  21. package/src/__tests__/sessions.test.ts +227 -0
  22. package/src/__tests__/sharing.test.ts +288 -0
  23. package/src/__tests__/snapshots.test.ts +581 -0
  24. package/src/__tests__/state-db.test.ts +334 -0
  25. package/src/__tests__/stream-with-tools.test.ts +732 -0
  26. package/src/__tests__/subagents.test.ts +176 -0
  27. package/src/__tests__/system-prompt.test.ts +169 -0
  28. package/src/__tests__/tool-converter.test.ts +256 -0
  29. package/src/__tests__/tool-schemas.test.ts +397 -0
  30. package/src/__tests__/tools.test.ts +143 -0
  31. package/src/__tests__/version.test.ts +49 -0
  32. package/src/agent/compaction-agent.ts +227 -0
  33. package/src/agent/context-manager.ts +435 -0
  34. package/src/agent/context.ts +427 -0
  35. package/src/agent/deploy-preview.ts +426 -0
  36. package/src/agent/index.ts +68 -0
  37. package/src/agent/loop.ts +717 -0
  38. package/src/agent/modes.ts +429 -0
  39. package/src/agent/permissions.ts +466 -0
  40. package/src/agent/subagents/base.ts +116 -0
  41. package/src/agent/subagents/cost.ts +51 -0
  42. package/src/agent/subagents/explore.ts +42 -0
  43. package/src/agent/subagents/general.ts +54 -0
  44. package/src/agent/subagents/index.ts +102 -0
  45. package/src/agent/subagents/infra.ts +59 -0
  46. package/src/agent/subagents/security.ts +69 -0
  47. package/src/agent/system-prompt.ts +436 -0
  48. package/src/app.ts +122 -0
  49. package/src/audit/activity-log.ts +290 -0
  50. package/src/audit/compliance-checker.ts +540 -0
  51. package/src/audit/cost-tracker.ts +318 -0
  52. package/src/audit/index.ts +23 -0
  53. package/src/audit/security-scanner.ts +596 -0
  54. package/src/auth/guard.ts +75 -0
  55. package/src/auth/index.ts +56 -0
  56. package/src/auth/oauth.ts +455 -0
  57. package/src/auth/providers.ts +470 -0
  58. package/src/auth/sso.ts +113 -0
  59. package/src/auth/store.ts +505 -0
  60. package/src/auth/types.ts +187 -0
  61. package/src/build.ts +141 -0
  62. package/src/cli/index.ts +16 -0
  63. package/src/cli/init.ts +854 -0
  64. package/src/cli/openapi-spec.ts +356 -0
  65. package/src/cli/run.ts +237 -0
  66. package/src/cli/serve-auth.ts +80 -0
  67. package/src/cli/serve.ts +462 -0
  68. package/src/cli/web.ts +67 -0
  69. package/src/cli.ts +1417 -0
  70. package/src/clients/core-engine-client.ts +227 -0
  71. package/src/clients/enterprise-client.ts +334 -0
  72. package/src/clients/generator-client.ts +351 -0
  73. package/src/clients/git-client.ts +627 -0
  74. package/src/clients/github-client.ts +410 -0
  75. package/src/clients/helm-client.ts +504 -0
  76. package/src/clients/index.ts +80 -0
  77. package/src/clients/k8s-client.ts +497 -0
  78. package/src/clients/llm-client.ts +161 -0
  79. package/src/clients/rest-client.ts +130 -0
  80. package/src/clients/service-discovery.ts +33 -0
  81. package/src/clients/terraform-client.ts +482 -0
  82. package/src/clients/tools-client.ts +1843 -0
  83. package/src/clients/ws-client.ts +115 -0
  84. package/src/commands/analyze/index.ts +352 -0
  85. package/src/commands/apply/helm.ts +473 -0
  86. package/src/commands/apply/index.ts +213 -0
  87. package/src/commands/apply/k8s.ts +454 -0
  88. package/src/commands/apply/terraform.ts +582 -0
  89. package/src/commands/ask.ts +167 -0
  90. package/src/commands/audit/index.ts +238 -0
  91. package/src/commands/auth-cloud.ts +294 -0
  92. package/src/commands/auth-list.ts +134 -0
  93. package/src/commands/auth-profile.ts +121 -0
  94. package/src/commands/auth-status.ts +141 -0
  95. package/src/commands/aws/ec2.ts +501 -0
  96. package/src/commands/aws/iam.ts +397 -0
  97. package/src/commands/aws/index.ts +133 -0
  98. package/src/commands/aws/lambda.ts +396 -0
  99. package/src/commands/aws/rds.ts +439 -0
  100. package/src/commands/aws/s3.ts +439 -0
  101. package/src/commands/aws/vpc.ts +393 -0
  102. package/src/commands/aws-discover.ts +649 -0
  103. package/src/commands/aws-terraform.ts +805 -0
  104. package/src/commands/azure/aks.ts +376 -0
  105. package/src/commands/azure/functions.ts +253 -0
  106. package/src/commands/azure/index.ts +116 -0
  107. package/src/commands/azure/storage.ts +478 -0
  108. package/src/commands/azure/vm.ts +355 -0
  109. package/src/commands/billing/index.ts +256 -0
  110. package/src/commands/chat.ts +314 -0
  111. package/src/commands/config.ts +346 -0
  112. package/src/commands/cost/cloud-cost-estimator.ts +266 -0
  113. package/src/commands/cost/estimator.ts +79 -0
  114. package/src/commands/cost/index.ts +594 -0
  115. package/src/commands/cost/parsers/terraform.ts +273 -0
  116. package/src/commands/cost/parsers/types.ts +25 -0
  117. package/src/commands/cost/pricing/aws.ts +544 -0
  118. package/src/commands/cost/pricing/azure.ts +499 -0
  119. package/src/commands/cost/pricing/gcp.ts +396 -0
  120. package/src/commands/cost/pricing/index.ts +40 -0
  121. package/src/commands/demo.ts +250 -0
  122. package/src/commands/doctor.ts +794 -0
  123. package/src/commands/drift/index.ts +439 -0
  124. package/src/commands/explain.ts +277 -0
  125. package/src/commands/feedback.ts +389 -0
  126. package/src/commands/fix.ts +324 -0
  127. package/src/commands/fs/index.ts +402 -0
  128. package/src/commands/gcp/compute.ts +325 -0
  129. package/src/commands/gcp/functions.ts +271 -0
  130. package/src/commands/gcp/gke.ts +438 -0
  131. package/src/commands/gcp/iam.ts +344 -0
  132. package/src/commands/gcp/index.ts +129 -0
  133. package/src/commands/gcp/storage.ts +284 -0
  134. package/src/commands/generate-helm.ts +1249 -0
  135. package/src/commands/generate-k8s.ts +1560 -0
  136. package/src/commands/generate-terraform.ts +1460 -0
  137. package/src/commands/gh/index.ts +863 -0
  138. package/src/commands/git/index.ts +1343 -0
  139. package/src/commands/helm/index.ts +1126 -0
  140. package/src/commands/help.ts +539 -0
  141. package/src/commands/history.ts +142 -0
  142. package/src/commands/import.ts +868 -0
  143. package/src/commands/index.ts +367 -0
  144. package/src/commands/init.ts +1046 -0
  145. package/src/commands/k8s/index.ts +1137 -0
  146. package/src/commands/login.ts +631 -0
  147. package/src/commands/logout.ts +83 -0
  148. package/src/commands/onboarding.ts +228 -0
  149. package/src/commands/plan/display.ts +279 -0
  150. package/src/commands/plan/index.ts +599 -0
  151. package/src/commands/preview.ts +452 -0
  152. package/src/commands/questionnaire.ts +1270 -0
  153. package/src/commands/resume.ts +55 -0
  154. package/src/commands/team/index.ts +346 -0
  155. package/src/commands/template.ts +232 -0
  156. package/src/commands/tf/index.ts +1034 -0
  157. package/src/commands/upgrade.ts +550 -0
  158. package/src/commands/usage/index.ts +134 -0
  159. package/src/commands/version.ts +170 -0
  160. package/src/compat/index.ts +2 -0
  161. package/src/compat/runtime.ts +12 -0
  162. package/src/compat/sqlite.ts +107 -0
  163. package/src/config/index.ts +17 -0
  164. package/src/config/manager.ts +530 -0
  165. package/src/config/safety-policy.ts +358 -0
  166. package/src/config/schema.ts +125 -0
  167. package/src/config/types.ts +527 -0
  168. package/src/context/context-db.ts +199 -0
  169. package/src/demo/index.ts +349 -0
  170. package/src/demo/scenarios/full-journey.ts +229 -0
  171. package/src/demo/scenarios/getting-started.ts +127 -0
  172. package/src/demo/scenarios/helm-release.ts +341 -0
  173. package/src/demo/scenarios/k8s-deployment.ts +194 -0
  174. package/src/demo/scenarios/terraform-vpc.ts +170 -0
  175. package/src/demo/types.ts +92 -0
  176. package/src/engine/cost-estimator.ts +438 -0
  177. package/src/engine/diagram-generator.ts +256 -0
  178. package/src/engine/drift-detector.ts +902 -0
  179. package/src/engine/executor.ts +1035 -0
  180. package/src/engine/index.ts +76 -0
  181. package/src/engine/orchestrator.ts +636 -0
  182. package/src/engine/planner.ts +720 -0
  183. package/src/engine/safety.ts +743 -0
  184. package/src/engine/verifier.ts +770 -0
  185. package/src/enterprise/audit.ts +348 -0
  186. package/src/enterprise/auth.ts +270 -0
  187. package/src/enterprise/billing.ts +822 -0
  188. package/src/enterprise/index.ts +17 -0
  189. package/src/enterprise/teams.ts +443 -0
  190. package/src/generator/best-practices.ts +1608 -0
  191. package/src/generator/helm.ts +630 -0
  192. package/src/generator/index.ts +37 -0
  193. package/src/generator/intent-parser.ts +514 -0
  194. package/src/generator/kubernetes.ts +976 -0
  195. package/src/generator/terraform.ts +1867 -0
  196. package/src/history/index.ts +8 -0
  197. package/src/history/manager.ts +322 -0
  198. package/src/history/types.ts +34 -0
  199. package/src/hooks/config.ts +432 -0
  200. package/src/hooks/engine.ts +391 -0
  201. package/src/hooks/index.ts +4 -0
  202. package/src/llm/auth-bridge.ts +198 -0
  203. package/src/llm/circuit-breaker.ts +140 -0
  204. package/src/llm/config-loader.ts +201 -0
  205. package/src/llm/cost-calculator.ts +171 -0
  206. package/src/llm/index.ts +8 -0
  207. package/src/llm/model-aliases.ts +115 -0
  208. package/src/llm/provider-registry.ts +63 -0
  209. package/src/llm/providers/anthropic.ts +433 -0
  210. package/src/llm/providers/bedrock.ts +477 -0
  211. package/src/llm/providers/google.ts +405 -0
  212. package/src/llm/providers/ollama.ts +767 -0
  213. package/src/llm/providers/openai-compatible.ts +340 -0
  214. package/src/llm/providers/openai.ts +328 -0
  215. package/src/llm/providers/openrouter.ts +338 -0
  216. package/src/llm/router.ts +1035 -0
  217. package/src/llm/types.ts +232 -0
  218. package/src/lsp/client.ts +298 -0
  219. package/src/lsp/languages.ts +116 -0
  220. package/src/lsp/manager.ts +278 -0
  221. package/src/mcp/client.ts +402 -0
  222. package/src/mcp/index.ts +5 -0
  223. package/src/mcp/manager.ts +133 -0
  224. package/src/nimbus.ts +214 -0
  225. package/src/plugins/index.ts +27 -0
  226. package/src/plugins/loader.ts +334 -0
  227. package/src/plugins/manager.ts +376 -0
  228. package/src/plugins/types.ts +284 -0
  229. package/src/scanners/cicd-scanner.ts +258 -0
  230. package/src/scanners/cloud-scanner.ts +466 -0
  231. package/src/scanners/framework-scanner.ts +469 -0
  232. package/src/scanners/iac-scanner.ts +388 -0
  233. package/src/scanners/index.ts +539 -0
  234. package/src/scanners/language-scanner.ts +276 -0
  235. package/src/scanners/package-manager-scanner.ts +277 -0
  236. package/src/scanners/types.ts +172 -0
  237. package/src/sessions/manager.ts +365 -0
  238. package/src/sessions/types.ts +44 -0
  239. package/src/sharing/sync.ts +296 -0
  240. package/src/sharing/viewer.ts +97 -0
  241. package/src/snapshots/index.ts +2 -0
  242. package/src/snapshots/manager.ts +530 -0
  243. package/src/state/artifacts.ts +147 -0
  244. package/src/state/audit.ts +137 -0
  245. package/src/state/billing.ts +240 -0
  246. package/src/state/checkpoints.ts +117 -0
  247. package/src/state/config.ts +67 -0
  248. package/src/state/conversations.ts +14 -0
  249. package/src/state/credentials.ts +154 -0
  250. package/src/state/db.ts +58 -0
  251. package/src/state/index.ts +26 -0
  252. package/src/state/messages.ts +115 -0
  253. package/src/state/projects.ts +123 -0
  254. package/src/state/schema.ts +236 -0
  255. package/src/state/sessions.ts +147 -0
  256. package/src/state/teams.ts +200 -0
  257. package/src/telemetry.ts +108 -0
  258. package/src/tools/aws-ops.ts +952 -0
  259. package/src/tools/azure-ops.ts +579 -0
  260. package/src/tools/file-ops.ts +593 -0
  261. package/src/tools/gcp-ops.ts +625 -0
  262. package/src/tools/git-ops.ts +773 -0
  263. package/src/tools/github-ops.ts +799 -0
  264. package/src/tools/helm-ops.ts +943 -0
  265. package/src/tools/index.ts +17 -0
  266. package/src/tools/k8s-ops.ts +819 -0
  267. package/src/tools/schemas/converter.ts +184 -0
  268. package/src/tools/schemas/devops.ts +612 -0
  269. package/src/tools/schemas/index.ts +73 -0
  270. package/src/tools/schemas/standard.ts +1144 -0
  271. package/src/tools/schemas/types.ts +705 -0
  272. package/src/tools/terraform-ops.ts +862 -0
  273. package/src/types/ambient.d.ts +193 -0
  274. package/src/types/config.ts +83 -0
  275. package/src/types/drift.ts +116 -0
  276. package/src/types/enterprise.ts +335 -0
  277. package/src/types/index.ts +20 -0
  278. package/src/types/plan.ts +44 -0
  279. package/src/types/request.ts +65 -0
  280. package/src/types/response.ts +54 -0
  281. package/src/types/service.ts +51 -0
  282. package/src/ui/App.tsx +997 -0
  283. package/src/ui/DeployPreview.tsx +169 -0
  284. package/src/ui/Header.tsx +68 -0
  285. package/src/ui/InputBox.tsx +350 -0
  286. package/src/ui/MessageList.tsx +585 -0
  287. package/src/ui/PermissionPrompt.tsx +151 -0
  288. package/src/ui/StatusBar.tsx +158 -0
  289. package/src/ui/ToolCallDisplay.tsx +409 -0
  290. package/src/ui/chat-ui.ts +853 -0
  291. package/src/ui/index.ts +33 -0
  292. package/src/ui/ink/index.ts +711 -0
  293. package/src/ui/streaming.ts +176 -0
  294. package/src/ui/types.ts +57 -0
  295. package/src/utils/analytics.ts +72 -0
  296. package/src/utils/cost-warning.ts +27 -0
  297. package/src/utils/env.ts +46 -0
  298. package/src/utils/errors.ts +69 -0
  299. package/src/utils/event-bus.ts +38 -0
  300. package/src/utils/index.ts +24 -0
  301. package/src/utils/logger.ts +171 -0
  302. package/src/utils/rate-limiter.ts +121 -0
  303. package/src/utils/service-auth.ts +49 -0
  304. package/src/utils/validation.ts +53 -0
  305. package/src/version.ts +4 -0
  306. package/src/watcher/index.ts +163 -0
  307. package/src/wizard/approval.ts +383 -0
  308. package/src/wizard/index.ts +25 -0
  309. package/src/wizard/prompts.ts +338 -0
  310. package/src/wizard/types.ts +171 -0
  311. package/src/wizard/ui.ts +556 -0
  312. package/src/wizard/wizard.ts +304 -0
  313. package/tsconfig.json +24 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Generator Service Client
3
+ *
4
+ * CLI client for communicating with the Generator Service
5
+ * for conversational IaC generation
6
+ */
7
+
8
+ export interface ConversationResult {
9
+ message: string;
10
+ intent: {
11
+ type: 'generate' | 'modify' | 'explain' | 'help' | 'unknown';
12
+ confidence: number;
13
+ };
14
+ canGenerate: boolean;
15
+ nextQuestion?: string;
16
+ extractedRequirements?: {
17
+ provider?: string;
18
+ components?: string[];
19
+ environment?: string;
20
+ region?: string;
21
+ };
22
+ needsClarification?: string[];
23
+ suggestedActions?: Array<{
24
+ type: string;
25
+ label: string;
26
+ description: string;
27
+ }>;
28
+ }
29
+
30
+ export interface GeneratedFile {
31
+ path: string;
32
+ content: string;
33
+ }
34
+
35
+ export interface GenerationResult {
36
+ success: boolean;
37
+ files: Record<string, string>;
38
+ configuration: Record<string, unknown>;
39
+ stack: {
40
+ provider: string;
41
+ components: string[];
42
+ environment?: string;
43
+ region?: string;
44
+ };
45
+ bestPracticesReport?: {
46
+ summary: {
47
+ total_violations: number;
48
+ autofixable_violations: number;
49
+ };
50
+ };
51
+ errors?: string[];
52
+ }
53
+
54
+ export interface QuestionnaireResponse {
55
+ sessionId: string;
56
+ currentQuestion?: {
57
+ id: string;
58
+ text: string;
59
+ type: string;
60
+ options?: string[];
61
+ };
62
+ completed: boolean;
63
+ progress: number;
64
+ }
65
+
66
+ export class GeneratorClient {
67
+ private baseUrl: string;
68
+
69
+ constructor(baseUrl?: string) {
70
+ this.baseUrl = baseUrl || process.env.GENERATOR_SERVICE_URL || 'http://localhost:3003';
71
+ }
72
+
73
+ /**
74
+ * Check if the generator service is available
75
+ */
76
+ async isAvailable(): Promise<boolean> {
77
+ try {
78
+ const response = await fetch(`${this.baseUrl}/health`, {
79
+ method: 'GET',
80
+ signal: AbortSignal.timeout(5000),
81
+ });
82
+ return response.ok;
83
+ } catch {
84
+ return false;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Process a conversational message
90
+ * Sends user message to the generator service and gets response with intent detection
91
+ */
92
+ async processConversation(
93
+ sessionId: string,
94
+ message: string,
95
+ userId?: string
96
+ ): Promise<ConversationResult> {
97
+ const response = await fetch(`${this.baseUrl}/api/conversational/message`, {
98
+ method: 'POST',
99
+ headers: { 'Content-Type': 'application/json' },
100
+ body: JSON.stringify({ sessionId, message, userId }),
101
+ });
102
+
103
+ if (!response.ok) {
104
+ throw new Error(`Generator service error: ${response.status}`);
105
+ }
106
+
107
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
108
+ if (!data.success) {
109
+ throw new Error(data.error || 'Failed to process conversation');
110
+ }
111
+
112
+ const result = data.data;
113
+
114
+ // Determine if we can generate (have enough information)
115
+ const canGenerate =
116
+ result.intent?.type === 'generate' &&
117
+ (!result.needs_clarification || result.needs_clarification.length === 0) &&
118
+ result.extracted_requirements?.components?.length > 0;
119
+
120
+ return {
121
+ message: result.message,
122
+ intent: result.intent,
123
+ canGenerate,
124
+ nextQuestion: result.needs_clarification?.[0],
125
+ extractedRequirements: result.extracted_requirements,
126
+ needsClarification: result.needs_clarification,
127
+ suggestedActions: result.suggested_actions,
128
+ };
129
+ }
130
+
131
+ /**
132
+ * Generate infrastructure from a conversation session
133
+ */
134
+ async generateFromConversation(
135
+ sessionId: string,
136
+ options?: { applyBestPractices?: boolean; autofix?: boolean }
137
+ ): Promise<GenerationResult> {
138
+ const response = await fetch(`${this.baseUrl}/api/generate/from-conversation`, {
139
+ method: 'POST',
140
+ headers: { 'Content-Type': 'application/json' },
141
+ body: JSON.stringify({
142
+ sessionId,
143
+ applyBestPractices: options?.applyBestPractices ?? true,
144
+ autofix: options?.autofix ?? true,
145
+ }),
146
+ });
147
+
148
+ if (!response.ok) {
149
+ throw new Error(`Generator service error: ${response.status}`);
150
+ }
151
+
152
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
153
+ if (!data.success) {
154
+ throw new Error(data.error || 'Failed to generate infrastructure');
155
+ }
156
+
157
+ return {
158
+ success: true,
159
+ files: data.data.generated_files,
160
+ configuration: data.data.configuration,
161
+ stack: data.data.stack,
162
+ bestPracticesReport: data.data.best_practices_report,
163
+ errors: data.data.errors,
164
+ };
165
+ }
166
+
167
+ /**
168
+ * Get conversation session state
169
+ */
170
+ async getSession(sessionId: string): Promise<{
171
+ sessionId: string;
172
+ infrastructureStack?: {
173
+ provider?: string;
174
+ components?: string[];
175
+ environment?: string;
176
+ region?: string;
177
+ };
178
+ conversationHistory: Array<{
179
+ role: 'user' | 'assistant';
180
+ message: string;
181
+ timestamp: string;
182
+ }>;
183
+ } | null> {
184
+ const response = await fetch(`${this.baseUrl}/api/conversational/session/${sessionId}`, {
185
+ method: 'GET',
186
+ });
187
+
188
+ if (!response.ok) {
189
+ if (response.status === 404) {
190
+ return null;
191
+ }
192
+ throw new Error(`Generator service error: ${response.status}`);
193
+ }
194
+
195
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
196
+ if (!data.success) {
197
+ return null;
198
+ }
199
+
200
+ return {
201
+ sessionId: data.data.session_id,
202
+ infrastructureStack: data.data.infrastructure_stack,
203
+ conversationHistory: data.data.conversation_history || [],
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Clear conversation history but keep session
209
+ */
210
+ async clearHistory(sessionId: string): Promise<void> {
211
+ const response = await fetch(`${this.baseUrl}/api/conversational/clear/${sessionId}`, {
212
+ method: 'POST',
213
+ });
214
+
215
+ if (!response.ok) {
216
+ throw new Error(`Generator service error: ${response.status}`);
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Delete a conversation session
222
+ */
223
+ async deleteSession(sessionId: string): Promise<void> {
224
+ const response = await fetch(`${this.baseUrl}/api/conversational/session/${sessionId}`, {
225
+ method: 'DELETE',
226
+ });
227
+
228
+ if (!response.ok && response.status !== 404) {
229
+ throw new Error(`Generator service error: ${response.status}`);
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Start a questionnaire session
235
+ */
236
+ async startQuestionnaire(type: 'terraform' | 'kubernetes'): Promise<QuestionnaireResponse> {
237
+ const response = await fetch(`${this.baseUrl}/api/questionnaire/start`, {
238
+ method: 'POST',
239
+ headers: { 'Content-Type': 'application/json' },
240
+ body: JSON.stringify({ type }),
241
+ });
242
+
243
+ if (!response.ok) {
244
+ throw new Error(`Generator service error: ${response.status}`);
245
+ }
246
+
247
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
248
+ if (!data.success) {
249
+ throw new Error(data.error || 'Failed to start questionnaire');
250
+ }
251
+
252
+ return data.data;
253
+ }
254
+
255
+ /**
256
+ * Submit questionnaire answer
257
+ */
258
+ async submitQuestionnaireAnswer(
259
+ sessionId: string,
260
+ questionId: string,
261
+ value: unknown
262
+ ): Promise<QuestionnaireResponse> {
263
+ const response = await fetch(`${this.baseUrl}/api/questionnaire/answer`, {
264
+ method: 'POST',
265
+ headers: { 'Content-Type': 'application/json' },
266
+ body: JSON.stringify({ sessionId, questionId, value }),
267
+ });
268
+
269
+ if (!response.ok) {
270
+ throw new Error(`Generator service error: ${response.status}`);
271
+ }
272
+
273
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
274
+ if (!data.success) {
275
+ throw new Error(data.error || 'Failed to submit answer');
276
+ }
277
+
278
+ return data.data;
279
+ }
280
+
281
+ /**
282
+ * Generate from completed questionnaire
283
+ */
284
+ async generateFromQuestionnaire(
285
+ sessionId: string,
286
+ options?: { applyBestPractices?: boolean; autofix?: boolean }
287
+ ): Promise<GenerationResult> {
288
+ const response = await fetch(`${this.baseUrl}/api/generate/from-questionnaire`, {
289
+ method: 'POST',
290
+ headers: { 'Content-Type': 'application/json' },
291
+ body: JSON.stringify({
292
+ sessionId,
293
+ applyBestPractices: options?.applyBestPractices ?? true,
294
+ autofix: options?.autofix ?? true,
295
+ }),
296
+ });
297
+
298
+ if (!response.ok) {
299
+ throw new Error(`Generator service error: ${response.status}`);
300
+ }
301
+
302
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
303
+ if (!data.success) {
304
+ throw new Error(data.error || 'Failed to generate from questionnaire');
305
+ }
306
+
307
+ return {
308
+ success: true,
309
+ files: data.data.generated_files,
310
+ configuration: data.data.configuration,
311
+ stack: {
312
+ provider: data.data.configuration?.selected_provider || 'aws',
313
+ components: data.data.configuration?.selected_components || [],
314
+ },
315
+ bestPracticesReport: data.data.best_practices_report,
316
+ };
317
+ }
318
+
319
+ /**
320
+ * List available templates
321
+ */
322
+ async listTemplates(type?: 'terraform' | 'kubernetes'): Promise<
323
+ Array<{
324
+ id: string;
325
+ name: string;
326
+ type: string;
327
+ provider: string;
328
+ component: string;
329
+ }>
330
+ > {
331
+ const url = type
332
+ ? `${this.baseUrl}/api/templates/type/${type}`
333
+ : `${this.baseUrl}/api/templates`;
334
+
335
+ const response = await fetch(url, { method: 'GET' });
336
+
337
+ if (!response.ok) {
338
+ throw new Error(`Generator service error: ${response.status}`);
339
+ }
340
+
341
+ const data = (await response.json()) as { success: boolean; data: any; error?: string };
342
+ if (!data.success) {
343
+ throw new Error(data.error || 'Failed to list templates');
344
+ }
345
+
346
+ return data.data;
347
+ }
348
+ }
349
+
350
+ // Singleton instance
351
+ export const generatorClient = new GeneratorClient();