@build-astron-co/nimbus 0.3.0 → 0.4.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 (441) hide show
  1. package/bin/nimbus.cmd +41 -0
  2. package/bin/nimbus.mjs +70 -0
  3. package/completions/nimbus.bash +38 -0
  4. package/completions/nimbus.fish +48 -0
  5. package/completions/nimbus.zsh +81 -0
  6. package/dist/src/agent/compaction-agent.js +215 -0
  7. package/dist/src/agent/context-manager.js +385 -0
  8. package/dist/src/agent/context.js +322 -0
  9. package/dist/src/agent/deploy-preview.js +395 -0
  10. package/dist/src/agent/expand-files.js +95 -0
  11. package/dist/src/agent/index.js +18 -0
  12. package/dist/src/agent/loop.js +1535 -0
  13. package/dist/src/agent/modes.js +347 -0
  14. package/dist/src/agent/permissions.js +396 -0
  15. package/dist/src/agent/subagents/base.js +67 -0
  16. package/dist/src/agent/subagents/cost.js +45 -0
  17. package/dist/src/agent/subagents/explore.js +36 -0
  18. package/dist/src/agent/subagents/general.js +41 -0
  19. package/dist/src/agent/subagents/index.js +88 -0
  20. package/dist/src/agent/subagents/infra.js +52 -0
  21. package/dist/src/agent/subagents/security.js +60 -0
  22. package/dist/src/agent/system-prompt.js +860 -0
  23. package/dist/src/app.js +152 -0
  24. package/dist/src/audit/activity-log.js +209 -0
  25. package/dist/src/audit/compliance-checker.js +419 -0
  26. package/dist/src/audit/cost-tracker.js +231 -0
  27. package/dist/src/audit/index.js +10 -0
  28. package/dist/src/audit/security-scanner.js +490 -0
  29. package/dist/src/auth/guard.js +64 -0
  30. package/dist/src/auth/index.js +19 -0
  31. package/dist/src/auth/keychain.js +79 -0
  32. package/dist/src/auth/oauth.js +389 -0
  33. package/dist/src/auth/providers.js +415 -0
  34. package/dist/src/auth/sso.js +87 -0
  35. package/dist/src/auth/store.js +424 -0
  36. package/dist/src/auth/types.js +5 -0
  37. package/dist/src/cli/index.js +8 -0
  38. package/dist/src/cli/init.js +1048 -0
  39. package/dist/src/cli/openapi-spec.js +346 -0
  40. package/dist/src/cli/run.js +505 -0
  41. package/dist/src/cli/serve-auth.js +56 -0
  42. package/dist/src/cli/serve.js +432 -0
  43. package/dist/src/cli/web.js +50 -0
  44. package/dist/src/cli.js +1574 -0
  45. package/dist/src/clients/core-engine-client.js +156 -0
  46. package/dist/src/clients/enterprise-client.js +246 -0
  47. package/dist/src/clients/generator-client.js +219 -0
  48. package/dist/src/clients/git-client.js +367 -0
  49. package/dist/src/clients/github-client.js +229 -0
  50. package/dist/src/clients/helm-client.js +299 -0
  51. package/dist/src/clients/index.js +18 -0
  52. package/dist/src/clients/k8s-client.js +270 -0
  53. package/dist/src/clients/llm-client.js +119 -0
  54. package/dist/src/clients/rest-client.js +104 -0
  55. package/dist/src/clients/service-discovery.js +35 -0
  56. package/dist/src/clients/terraform-client.js +302 -0
  57. package/dist/src/clients/tools-client.js +1227 -0
  58. package/dist/src/clients/ws-client.js +93 -0
  59. package/dist/src/commands/alias.js +91 -0
  60. package/dist/src/commands/analyze/index.js +313 -0
  61. package/dist/src/commands/apply/helm.js +375 -0
  62. package/dist/src/commands/apply/index.js +176 -0
  63. package/dist/src/commands/apply/k8s.js +350 -0
  64. package/dist/src/commands/apply/terraform.js +465 -0
  65. package/dist/src/commands/ask.js +137 -0
  66. package/dist/src/commands/audit/index.js +322 -0
  67. package/dist/src/commands/auth-cloud.js +345 -0
  68. package/dist/src/commands/auth-list.js +112 -0
  69. package/dist/src/commands/auth-profile.js +104 -0
  70. package/dist/src/commands/auth-refresh.js +161 -0
  71. package/dist/src/commands/auth-status.js +122 -0
  72. package/dist/src/commands/aws/ec2.js +402 -0
  73. package/dist/src/commands/aws/iam.js +304 -0
  74. package/dist/src/commands/aws/index.js +108 -0
  75. package/dist/src/commands/aws/lambda.js +317 -0
  76. package/dist/src/commands/aws/rds.js +345 -0
  77. package/dist/src/commands/aws/s3.js +346 -0
  78. package/dist/src/commands/aws/vpc.js +302 -0
  79. package/dist/src/commands/aws-discover.js +413 -0
  80. package/dist/src/commands/aws-terraform.js +618 -0
  81. package/dist/src/commands/azure/aks.js +305 -0
  82. package/dist/src/commands/azure/functions.js +200 -0
  83. package/dist/src/commands/azure/index.js +93 -0
  84. package/dist/src/commands/azure/storage.js +378 -0
  85. package/dist/src/commands/azure/vm.js +291 -0
  86. package/dist/src/commands/billing/index.js +224 -0
  87. package/dist/src/commands/chat.js +259 -0
  88. package/dist/src/commands/completions.js +255 -0
  89. package/dist/src/commands/config.js +291 -0
  90. package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
  91. package/dist/src/commands/cost/estimator.js +73 -0
  92. package/dist/src/commands/cost/index.js +625 -0
  93. package/dist/src/commands/cost/parsers/terraform.js +234 -0
  94. package/dist/src/commands/cost/parsers/types.js +4 -0
  95. package/dist/src/commands/cost/pricing/aws.js +501 -0
  96. package/dist/src/commands/cost/pricing/azure.js +462 -0
  97. package/dist/src/commands/cost/pricing/gcp.js +359 -0
  98. package/dist/src/commands/cost/pricing/index.js +24 -0
  99. package/dist/src/commands/demo.js +196 -0
  100. package/dist/src/commands/deploy.js +215 -0
  101. package/dist/src/commands/doctor.js +1291 -0
  102. package/dist/src/commands/drift/index.js +674 -0
  103. package/dist/src/commands/explain.js +235 -0
  104. package/dist/src/commands/export.js +120 -0
  105. package/dist/src/commands/feedback.js +319 -0
  106. package/dist/src/commands/fix.js +263 -0
  107. package/dist/src/commands/fs/index.js +338 -0
  108. package/dist/src/commands/gcp/compute.js +266 -0
  109. package/dist/src/commands/gcp/functions.js +221 -0
  110. package/dist/src/commands/gcp/gke.js +357 -0
  111. package/dist/src/commands/gcp/iam.js +295 -0
  112. package/dist/src/commands/gcp/index.js +105 -0
  113. package/dist/src/commands/gcp/storage.js +232 -0
  114. package/dist/src/commands/generate-helm.js +1026 -0
  115. package/dist/src/commands/generate-k8s.js +1263 -0
  116. package/dist/src/commands/generate-terraform.js +1058 -0
  117. package/dist/src/commands/gh/index.js +663 -0
  118. package/dist/src/commands/git/index.js +1208 -0
  119. package/dist/src/commands/helm/index.js +985 -0
  120. package/dist/src/commands/help.js +639 -0
  121. package/dist/src/commands/history.js +120 -0
  122. package/dist/src/commands/import.js +782 -0
  123. package/dist/src/commands/incident.js +144 -0
  124. package/dist/src/commands/index.js +109 -0
  125. package/dist/src/commands/init.js +955 -0
  126. package/dist/src/commands/k8s/index.js +979 -0
  127. package/dist/src/commands/login.js +588 -0
  128. package/dist/src/commands/logout.js +61 -0
  129. package/dist/src/commands/logs.js +160 -0
  130. package/dist/src/commands/onboarding.js +382 -0
  131. package/dist/src/commands/pipeline.js +153 -0
  132. package/dist/src/commands/plan/display.js +216 -0
  133. package/dist/src/commands/plan/index.js +525 -0
  134. package/dist/src/commands/plugin.js +325 -0
  135. package/dist/src/commands/preview.js +356 -0
  136. package/dist/src/commands/profile.js +297 -0
  137. package/dist/src/commands/questionnaire.js +1021 -0
  138. package/dist/src/commands/resume.js +35 -0
  139. package/dist/src/commands/rollback.js +259 -0
  140. package/dist/src/commands/rollout.js +74 -0
  141. package/dist/src/commands/runbook.js +307 -0
  142. package/dist/src/commands/schedule.js +202 -0
  143. package/dist/src/commands/status.js +213 -0
  144. package/dist/src/commands/team/index.js +309 -0
  145. package/dist/src/commands/team-context.js +200 -0
  146. package/dist/src/commands/template.js +204 -0
  147. package/dist/src/commands/tf/index.js +989 -0
  148. package/dist/src/commands/upgrade.js +515 -0
  149. package/dist/src/commands/usage/index.js +118 -0
  150. package/dist/src/commands/version.js +145 -0
  151. package/dist/src/commands/watch.js +127 -0
  152. package/dist/src/compat/index.js +2 -0
  153. package/dist/src/compat/runtime.js +10 -0
  154. package/dist/src/compat/sqlite.js +144 -0
  155. package/dist/src/config/index.js +6 -0
  156. package/dist/src/config/manager.js +469 -0
  157. package/dist/src/config/mode-store.js +57 -0
  158. package/dist/src/config/profiles.js +66 -0
  159. package/dist/src/config/safety-policy.js +251 -0
  160. package/dist/src/config/schema.js +107 -0
  161. package/dist/src/config/types.js +311 -0
  162. package/dist/src/config/workspace-state.js +38 -0
  163. package/dist/src/context/context-db.js +138 -0
  164. package/dist/src/demo/index.js +295 -0
  165. package/dist/src/demo/scenarios/full-journey.js +226 -0
  166. package/dist/src/demo/scenarios/getting-started.js +124 -0
  167. package/dist/src/demo/scenarios/helm-release.js +334 -0
  168. package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
  169. package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
  170. package/dist/src/demo/types.js +6 -0
  171. package/dist/src/engine/cost-estimator.js +334 -0
  172. package/dist/src/engine/diagram-generator.js +192 -0
  173. package/dist/src/engine/drift-detector.js +688 -0
  174. package/dist/src/engine/executor.js +832 -0
  175. package/dist/src/engine/index.js +39 -0
  176. package/dist/src/engine/orchestrator.js +436 -0
  177. package/dist/src/engine/planner.js +616 -0
  178. package/dist/src/engine/safety.js +609 -0
  179. package/dist/src/engine/verifier.js +664 -0
  180. package/dist/src/enterprise/audit.js +241 -0
  181. package/dist/src/enterprise/auth.js +189 -0
  182. package/dist/src/enterprise/billing.js +512 -0
  183. package/dist/src/enterprise/index.js +16 -0
  184. package/dist/src/enterprise/teams.js +315 -0
  185. package/dist/src/generator/best-practices.js +1375 -0
  186. package/dist/src/generator/helm.js +495 -0
  187. package/dist/src/generator/index.js +11 -0
  188. package/dist/src/generator/intent-parser.js +420 -0
  189. package/dist/src/generator/kubernetes.js +773 -0
  190. package/dist/src/generator/terraform.js +1472 -0
  191. package/dist/src/history/index.js +6 -0
  192. package/dist/src/history/manager.js +199 -0
  193. package/dist/src/history/types.js +6 -0
  194. package/dist/src/hooks/config.js +318 -0
  195. package/dist/src/hooks/engine.js +317 -0
  196. package/dist/src/hooks/index.js +2 -0
  197. package/dist/src/llm/auth-bridge.js +157 -0
  198. package/dist/src/llm/circuit-breaker.js +116 -0
  199. package/dist/src/llm/config-loader.js +172 -0
  200. package/dist/src/llm/cost-calculator.js +137 -0
  201. package/dist/src/llm/index.js +7 -0
  202. package/dist/src/llm/model-aliases.js +99 -0
  203. package/dist/src/llm/provider-registry.js +57 -0
  204. package/dist/src/llm/providers/anthropic.js +430 -0
  205. package/dist/src/llm/providers/bedrock.js +409 -0
  206. package/dist/src/llm/providers/google.js +344 -0
  207. package/dist/src/llm/providers/ollama.js +661 -0
  208. package/dist/src/llm/providers/openai-compatible.js +289 -0
  209. package/dist/src/llm/providers/openai.js +284 -0
  210. package/dist/src/llm/providers/openrouter.js +293 -0
  211. package/dist/src/llm/router.js +844 -0
  212. package/dist/src/llm/types.js +69 -0
  213. package/dist/src/lsp/client.js +239 -0
  214. package/dist/src/lsp/languages.js +95 -0
  215. package/dist/src/lsp/manager.js +243 -0
  216. package/dist/src/mcp/client.js +289 -0
  217. package/dist/src/mcp/index.js +5 -0
  218. package/dist/src/mcp/manager.js +113 -0
  219. package/dist/src/nimbus.js +212 -0
  220. package/dist/src/plugins/index.js +13 -0
  221. package/dist/src/plugins/loader.js +280 -0
  222. package/dist/src/plugins/manager.js +282 -0
  223. package/dist/src/plugins/types.js +23 -0
  224. package/dist/src/scanners/cicd-scanner.js +230 -0
  225. package/dist/src/scanners/cloud-scanner.js +415 -0
  226. package/dist/src/scanners/framework-scanner.js +430 -0
  227. package/dist/src/scanners/iac-scanner.js +350 -0
  228. package/dist/src/scanners/index.js +454 -0
  229. package/dist/src/scanners/language-scanner.js +258 -0
  230. package/dist/src/scanners/package-manager-scanner.js +252 -0
  231. package/dist/src/scanners/types.js +6 -0
  232. package/dist/src/sessions/manager.js +395 -0
  233. package/dist/src/sessions/types.js +4 -0
  234. package/dist/src/sharing/sync.js +238 -0
  235. package/dist/src/sharing/viewer.js +131 -0
  236. package/dist/src/snapshots/index.js +1 -0
  237. package/dist/src/snapshots/manager.js +432 -0
  238. package/dist/src/state/artifacts.js +94 -0
  239. package/dist/src/state/audit.js +73 -0
  240. package/dist/src/state/billing.js +126 -0
  241. package/dist/src/state/checkpoints.js +81 -0
  242. package/dist/src/state/config.js +58 -0
  243. package/dist/src/state/conversations.js +7 -0
  244. package/dist/src/state/credentials.js +96 -0
  245. package/dist/src/state/db.js +53 -0
  246. package/dist/src/state/index.js +23 -0
  247. package/dist/src/state/messages.js +76 -0
  248. package/dist/src/state/projects.js +92 -0
  249. package/dist/src/state/schema.js +233 -0
  250. package/dist/src/state/sessions.js +79 -0
  251. package/dist/src/state/teams.js +131 -0
  252. package/dist/src/telemetry.js +91 -0
  253. package/dist/src/tools/aws-ops.js +747 -0
  254. package/dist/src/tools/azure-ops.js +491 -0
  255. package/dist/src/tools/file-ops.js +451 -0
  256. package/dist/src/tools/gcp-ops.js +559 -0
  257. package/dist/src/tools/git-ops.js +557 -0
  258. package/dist/src/tools/github-ops.js +460 -0
  259. package/dist/src/tools/helm-ops.js +634 -0
  260. package/dist/src/tools/index.js +16 -0
  261. package/dist/src/tools/k8s-ops.js +579 -0
  262. package/dist/src/tools/schemas/converter.js +129 -0
  263. package/dist/src/tools/schemas/devops.js +3319 -0
  264. package/dist/src/tools/schemas/index.js +19 -0
  265. package/dist/src/tools/schemas/standard.js +966 -0
  266. package/dist/src/tools/schemas/types.js +409 -0
  267. package/dist/src/tools/spawn-exec.js +109 -0
  268. package/dist/src/tools/terraform-ops.js +627 -0
  269. package/dist/src/types/config.js +1 -0
  270. package/dist/src/types/drift.js +4 -0
  271. package/dist/src/types/enterprise.js +5 -0
  272. package/dist/src/types/index.js +14 -0
  273. package/dist/src/types/plan.js +1 -0
  274. package/dist/src/types/request.js +1 -0
  275. package/dist/src/types/response.js +1 -0
  276. package/dist/src/types/service.js +1 -0
  277. package/dist/src/ui/App.js +1672 -0
  278. package/dist/src/ui/DeployPreview.js +60 -0
  279. package/dist/src/ui/FileDiffModal.js +108 -0
  280. package/dist/src/ui/Header.js +46 -0
  281. package/dist/src/ui/HelpModal.js +9 -0
  282. package/dist/src/ui/InputBox.js +408 -0
  283. package/dist/src/ui/MessageList.js +795 -0
  284. package/dist/src/ui/PermissionPrompt.js +72 -0
  285. package/dist/src/ui/StatusBar.js +109 -0
  286. package/dist/src/ui/TerminalPane.js +31 -0
  287. package/dist/src/ui/ToolCallDisplay.js +303 -0
  288. package/dist/src/ui/TreePane.js +83 -0
  289. package/dist/src/ui/chat-ui.js +721 -0
  290. package/dist/src/ui/index.js +11 -0
  291. package/dist/src/ui/ink/index.js +1325 -0
  292. package/dist/src/ui/streaming.js +137 -0
  293. package/dist/src/ui/theme.js +78 -0
  294. package/dist/src/ui/types.js +7 -0
  295. package/dist/src/utils/analytics.js +61 -0
  296. package/dist/src/utils/cost-warning.js +25 -0
  297. package/dist/src/utils/env.js +42 -0
  298. package/dist/src/utils/errors.js +54 -0
  299. package/dist/src/utils/event-bus.js +22 -0
  300. package/dist/src/utils/index.js +16 -0
  301. package/dist/src/utils/logger.js +150 -0
  302. package/dist/src/utils/rate-limiter.js +90 -0
  303. package/dist/src/utils/service-auth.js +36 -0
  304. package/dist/src/utils/validation.js +39 -0
  305. package/dist/src/version.js +3 -0
  306. package/dist/src/watcher/index.js +192 -0
  307. package/dist/src/wizard/approval.js +275 -0
  308. package/dist/src/wizard/index.js +13 -0
  309. package/dist/src/wizard/prompts.js +273 -0
  310. package/dist/src/wizard/types.js +4 -0
  311. package/dist/src/wizard/ui.js +453 -0
  312. package/dist/src/wizard/wizard.js +227 -0
  313. package/package.json +22 -15
  314. package/src/__tests__/alias.test.ts +133 -0
  315. package/src/__tests__/cli-run.test.ts +237 -1
  316. package/src/__tests__/compat-sqlite.test.ts +68 -0
  317. package/src/__tests__/context-manager.test.ts +130 -0
  318. package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
  319. package/src/__tests__/doctor.test.ts +48 -0
  320. package/src/__tests__/export.test.ts +236 -0
  321. package/src/__tests__/gap-11-18-20.test.ts +958 -0
  322. package/src/__tests__/helm-streaming.test.ts +127 -0
  323. package/src/__tests__/incident.test.ts +179 -0
  324. package/src/__tests__/init.test.ts +54 -3
  325. package/src/__tests__/logs.test.ts +107 -0
  326. package/src/__tests__/loop-errors.test.ts +244 -0
  327. package/src/__tests__/perf-optimizations.test.ts +847 -0
  328. package/src/__tests__/pipeline.test.ts +50 -0
  329. package/src/__tests__/polish-phase3.test.ts +340 -0
  330. package/src/__tests__/profile.test.ts +237 -0
  331. package/src/__tests__/rollback.test.ts +83 -0
  332. package/src/__tests__/runbook.test.ts +219 -0
  333. package/src/__tests__/schedule.test.ts +206 -0
  334. package/src/__tests__/sessions.test.ts +95 -0
  335. package/src/__tests__/standalone-migration.test.ts +199 -0
  336. package/src/__tests__/status.test.ts +158 -0
  337. package/src/__tests__/stream-with-tools.test.ts +49 -1
  338. package/src/__tests__/system-prompt.test.ts +81 -2
  339. package/src/__tests__/terminal-gap-v2.test.ts +395 -0
  340. package/src/__tests__/terminal-parity.test.ts +393 -0
  341. package/src/__tests__/tf-apply.test.ts +187 -0
  342. package/src/__tests__/tool-schemas.test.ts +209 -4
  343. package/src/__tests__/version-json.test.ts +184 -0
  344. package/src/__tests__/watch.test.ts +129 -0
  345. package/src/agent/compaction-agent.ts +40 -1
  346. package/src/agent/context-manager.ts +67 -3
  347. package/src/agent/deploy-preview.ts +62 -1
  348. package/src/agent/expand-files.ts +108 -0
  349. package/src/agent/loop.ts +1312 -31
  350. package/src/agent/permissions.ts +51 -4
  351. package/src/agent/system-prompt.ts +573 -19
  352. package/src/app.ts +58 -0
  353. package/src/audit/security-scanner.ts +45 -0
  354. package/src/auth/keychain.ts +82 -0
  355. package/src/cli/init.ts +378 -5
  356. package/src/cli/run.ts +407 -16
  357. package/src/cli/serve.ts +78 -1
  358. package/src/cli/web.ts +10 -6
  359. package/src/cli.ts +312 -1
  360. package/src/clients/service-discovery.ts +30 -25
  361. package/src/commands/alias.ts +100 -0
  362. package/src/commands/audit/index.ts +121 -2
  363. package/src/commands/auth-cloud.ts +113 -0
  364. package/src/commands/auth-refresh.ts +187 -0
  365. package/src/commands/aws-discover.ts +144 -251
  366. package/src/commands/aws-terraform.ts +68 -118
  367. package/src/commands/chat.ts +9 -3
  368. package/src/commands/completions.ts +268 -0
  369. package/src/commands/config.ts +26 -0
  370. package/src/commands/cost/index.ts +218 -2
  371. package/src/commands/deploy.ts +260 -0
  372. package/src/commands/doctor.ts +744 -152
  373. package/src/commands/drift/index.ts +371 -23
  374. package/src/commands/export.ts +146 -0
  375. package/src/commands/generate-k8s.ts +9 -61
  376. package/src/commands/generate-terraform.ts +191 -449
  377. package/src/commands/help.ts +212 -36
  378. package/src/commands/history.ts +8 -1
  379. package/src/commands/incident.ts +166 -0
  380. package/src/commands/init.ts +5 -0
  381. package/src/commands/login.ts +86 -1
  382. package/src/commands/logs.ts +167 -0
  383. package/src/commands/onboarding.ts +211 -34
  384. package/src/commands/pipeline.ts +186 -0
  385. package/src/commands/plugin.ts +398 -0
  386. package/src/commands/profile.ts +342 -0
  387. package/src/commands/questionnaire.ts +0 -98
  388. package/src/commands/resume.ts +26 -34
  389. package/src/commands/rollback.ts +315 -0
  390. package/src/commands/rollout.ts +88 -0
  391. package/src/commands/runbook.ts +346 -0
  392. package/src/commands/schedule.ts +236 -0
  393. package/src/commands/status.ts +252 -0
  394. package/src/commands/team-context.ts +220 -0
  395. package/src/commands/template.ts +58 -57
  396. package/src/commands/tf/index.ts +70 -11
  397. package/src/commands/upgrade.ts +57 -0
  398. package/src/commands/version.ts +54 -50
  399. package/src/commands/watch.ts +153 -0
  400. package/src/compat/sqlite.ts +75 -5
  401. package/src/config/mode-store.ts +62 -0
  402. package/src/config/profiles.ts +84 -0
  403. package/src/config/types.ts +83 -1
  404. package/src/config/workspace-state.ts +53 -0
  405. package/src/engine/cost-estimator.ts +52 -10
  406. package/src/engine/executor.ts +33 -2
  407. package/src/engine/planner.ts +68 -1
  408. package/src/generator/terraform.ts +8 -0
  409. package/src/history/manager.ts +2 -74
  410. package/src/llm/cost-calculator.ts +2 -2
  411. package/src/llm/providers/anthropic.ts +50 -21
  412. package/src/llm/router.ts +76 -7
  413. package/src/lsp/languages.ts +3 -0
  414. package/src/lsp/manager.ts +20 -4
  415. package/src/nimbus.ts +34 -1
  416. package/src/sessions/manager.ts +108 -1
  417. package/src/sharing/viewer.ts +66 -0
  418. package/src/tools/file-ops.ts +22 -0
  419. package/src/tools/schemas/devops.ts +3007 -117
  420. package/src/tools/schemas/standard.ts +5 -1
  421. package/src/tools/schemas/types.ts +31 -1
  422. package/src/tools/spawn-exec.ts +148 -0
  423. package/src/ui/App.tsx +1183 -66
  424. package/src/ui/DeployPreview.tsx +62 -57
  425. package/src/ui/FileDiffModal.tsx +162 -0
  426. package/src/ui/Header.tsx +87 -24
  427. package/src/ui/HelpModal.tsx +57 -0
  428. package/src/ui/InputBox.tsx +163 -10
  429. package/src/ui/MessageList.tsx +487 -40
  430. package/src/ui/PermissionPrompt.tsx +17 -5
  431. package/src/ui/StatusBar.tsx +122 -3
  432. package/src/ui/TerminalPane.tsx +84 -0
  433. package/src/ui/ToolCallDisplay.tsx +252 -18
  434. package/src/ui/TreePane.tsx +132 -0
  435. package/src/ui/chat-ui.ts +41 -44
  436. package/src/ui/ink/index.ts +771 -38
  437. package/src/ui/theme.ts +104 -0
  438. package/src/ui/types.ts +18 -0
  439. package/src/version.ts +1 -1
  440. package/src/watcher/index.ts +66 -15
  441. package/src/wizard/types.ts +1 -0
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Intent Parser (Embedded)
3
+ *
4
+ * Parses natural language user input to extract infrastructure intent and entities.
5
+ * Uses the embedded LLM router directly instead of HTTP calls to llm-service.
6
+ *
7
+ * Refactored from: services/generator-service/src/conversational/intent-parser.ts
8
+ */
9
+ import { logger } from '../utils';
10
+ // ==========================================
11
+ // Constants
12
+ // ==========================================
13
+ /** System prompt for LLM-based intent classification. */
14
+ const INTENT_PROMPT = "Classify the user's infrastructure intent. Return JSON with fields: " +
15
+ 'intent (one of: generate, modify, explain, help), confidence (number 0-1), ' +
16
+ 'entities (array of {type: string, value: string} where type is one of: provider, component, environment, region, generation_type). ' +
17
+ 'Return ONLY the JSON object, no markdown.';
18
+ /** Valid intent types returned by the LLM. */
19
+ const VALID_INTENTS = new Set(['generate', 'modify', 'explain', 'help']);
20
+ // ==========================================
21
+ // IntentParser Class
22
+ // ==========================================
23
+ export class IntentParser {
24
+ patterns;
25
+ router;
26
+ constructor(router) {
27
+ this.patterns = this.initializePatterns();
28
+ this.router = router || null;
29
+ }
30
+ /**
31
+ * Set or update the LLM router (for lazy initialization)
32
+ */
33
+ setRouter(router) {
34
+ this.router = router;
35
+ }
36
+ /**
37
+ * Parse user input to extract intent and entities.
38
+ * Attempts LLM-based classification first, falls back to regex/keyword matching.
39
+ */
40
+ async parse(input) {
41
+ if (this.router) {
42
+ try {
43
+ const llmResult = await this.parseWithLLM(input);
44
+ if (llmResult) {
45
+ logger.debug(`Using LLM-classified intent: ${llmResult.type} (confidence: ${llmResult.confidence})`);
46
+ return llmResult;
47
+ }
48
+ }
49
+ catch (error) {
50
+ logger.debug(`LLM intent parsing failed, falling back to heuristics: ${error.message}`);
51
+ }
52
+ }
53
+ return this.parseHeuristic(input);
54
+ }
55
+ /**
56
+ * Classify intent using the embedded LLM router (replaces HTTP fetch to llm-service).
57
+ */
58
+ async parseWithLLM(input) {
59
+ if (!this.router) {
60
+ return null;
61
+ }
62
+ // Use a timeout via AbortController-like approach
63
+ const timeoutMs = 3_000;
64
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('LLM intent classification timed out')), timeoutMs));
65
+ const routePromise = this.router.route({
66
+ messages: [
67
+ { role: 'system', content: INTENT_PROMPT },
68
+ { role: 'user', content: input },
69
+ ],
70
+ maxTokens: 512,
71
+ temperature: 0.1,
72
+ });
73
+ const response = await Promise.race([routePromise, timeoutPromise]);
74
+ const content = response.content;
75
+ if (!content) {
76
+ throw new Error('LLM response missing content');
77
+ }
78
+ // Strip markdown code fences if present
79
+ const jsonStr = content
80
+ .replace(/^```(?:json)?\s*/i, '')
81
+ .replace(/\s*```\s*$/, '')
82
+ .trim();
83
+ const parsed = JSON.parse(jsonStr);
84
+ if (typeof parsed !== 'object' || parsed === null) {
85
+ throw new Error('LLM response is not an object');
86
+ }
87
+ const obj = parsed;
88
+ // Validate required fields
89
+ if (typeof obj.intent !== 'string' || typeof obj.confidence !== 'number') {
90
+ throw new Error('LLM response missing required fields');
91
+ }
92
+ // Map intent to type, defaulting to 'unknown' for unrecognized intents
93
+ const intentType = VALID_INTENTS.has(obj.intent)
94
+ ? obj.intent
95
+ : 'unknown';
96
+ // Only use LLM result if confidence is sufficient
97
+ const confidence = Math.min(obj.confidence, 1);
98
+ // Parse entities
99
+ const entities = [];
100
+ if (Array.isArray(obj.entities)) {
101
+ for (const entity of obj.entities) {
102
+ if (typeof entity === 'object' &&
103
+ entity !== null &&
104
+ typeof entity.type === 'string' &&
105
+ typeof entity.value === 'string') {
106
+ entities.push({
107
+ type: entity.type,
108
+ value: entity.value,
109
+ confidence: 0.9,
110
+ });
111
+ }
112
+ }
113
+ }
114
+ return {
115
+ type: intentType,
116
+ confidence,
117
+ entities,
118
+ };
119
+ }
120
+ /**
121
+ * Parse user input using regex patterns and keyword matching (fallback).
122
+ */
123
+ parseHeuristic(input) {
124
+ const normalizedInput = input.toLowerCase().trim();
125
+ // Try to match patterns
126
+ for (const pattern of this.patterns) {
127
+ const match = normalizedInput.match(pattern.pattern);
128
+ if (match) {
129
+ const entities = this.extractEntities(match, pattern);
130
+ return {
131
+ type: pattern.intent,
132
+ confidence: this.calculateConfidence(match, normalizedInput),
133
+ entities,
134
+ };
135
+ }
136
+ }
137
+ // No pattern matched - try keyword-based matching
138
+ const keywordIntent = this.matchByKeywords(normalizedInput);
139
+ if (keywordIntent) {
140
+ return keywordIntent;
141
+ }
142
+ // Unknown intent
143
+ return {
144
+ type: 'unknown',
145
+ confidence: 0,
146
+ entities: [],
147
+ };
148
+ }
149
+ /**
150
+ * Extract entities from regex match
151
+ */
152
+ extractEntities(match, pattern) {
153
+ const entities = [];
154
+ if (!pattern.entities) {
155
+ return entities;
156
+ }
157
+ for (const entityConfig of pattern.entities) {
158
+ try {
159
+ const value = entityConfig.extractor(match);
160
+ if (value) {
161
+ entities.push({
162
+ type: entityConfig.type,
163
+ value,
164
+ confidence: 0.9,
165
+ });
166
+ }
167
+ }
168
+ catch (error) {
169
+ logger.error('Error extracting entity', error);
170
+ }
171
+ }
172
+ return entities;
173
+ }
174
+ /**
175
+ * Calculate confidence score
176
+ */
177
+ calculateConfidence(match, input) {
178
+ const matchedLength = match[0].length;
179
+ const inputLength = input.length;
180
+ const coverage = matchedLength / inputLength;
181
+ return Math.min(0.9, 0.5 + coverage * 0.4);
182
+ }
183
+ /**
184
+ * Match intent by keywords when patterns don't match
185
+ */
186
+ matchByKeywords(input) {
187
+ const generateKeywords = [
188
+ 'create',
189
+ 'generate',
190
+ 'build',
191
+ 'setup',
192
+ 'deploy',
193
+ 'provision',
194
+ 'deployment',
195
+ 'pod',
196
+ 'statefulset',
197
+ 'daemonset',
198
+ 'cronjob',
199
+ 'ingress',
200
+ 'helm',
201
+ 'chart',
202
+ 'manifest',
203
+ ];
204
+ const modifyKeywords = ['change', 'modify', 'update', 'edit', 'adjust', 'alter'];
205
+ const explainKeywords = ['explain', 'what', 'why', 'how', 'tell me about', 'describe'];
206
+ const helpKeywords = ['help', 'assist', 'guide', 'support'];
207
+ if (generateKeywords.some(kw => input.includes(kw))) {
208
+ return { type: 'generate', confidence: 0.6, entities: this.extractKeywordEntities(input) };
209
+ }
210
+ if (modifyKeywords.some(kw => input.includes(kw))) {
211
+ return { type: 'modify', confidence: 0.6, entities: this.extractKeywordEntities(input) };
212
+ }
213
+ if (explainKeywords.some(kw => input.includes(kw))) {
214
+ return { type: 'explain', confidence: 0.6, entities: this.extractKeywordEntities(input) };
215
+ }
216
+ if (helpKeywords.some(kw => input.includes(kw))) {
217
+ return { type: 'help', confidence: 0.7, entities: [] };
218
+ }
219
+ return null;
220
+ }
221
+ /**
222
+ * Extract entities using keyword matching
223
+ */
224
+ extractKeywordEntities(input) {
225
+ const entities = [];
226
+ // Provider extraction
227
+ const providers = ['aws', 'gcp', 'google cloud', 'azure'];
228
+ for (const provider of providers) {
229
+ if (input.includes(provider)) {
230
+ entities.push({
231
+ type: 'provider',
232
+ value: provider === 'google cloud' ? 'gcp' : provider,
233
+ confidence: 0.9,
234
+ });
235
+ break;
236
+ }
237
+ }
238
+ // K8s workload type extraction
239
+ const k8sWorkloads = [
240
+ 'deployment',
241
+ 'pod',
242
+ 'service',
243
+ 'ingress',
244
+ 'namespace',
245
+ 'statefulset',
246
+ 'daemonset',
247
+ 'cronjob',
248
+ ];
249
+ let foundK8sWorkload = false;
250
+ for (const workload of k8sWorkloads) {
251
+ if (input.includes(workload)) {
252
+ entities.push({ type: 'component', value: workload, confidence: 0.8 });
253
+ foundK8sWorkload = true;
254
+ }
255
+ }
256
+ if (foundK8sWorkload) {
257
+ entities.push({ type: 'generation_type', value: 'kubernetes', confidence: 0.85 });
258
+ }
259
+ // Helm keyword extraction
260
+ const helmKeywords = ['helm chart', 'helm', 'chart', 'values.yaml'];
261
+ let foundHelm = false;
262
+ for (const keyword of helmKeywords) {
263
+ if (input.includes(keyword)) {
264
+ foundHelm = true;
265
+ break;
266
+ }
267
+ }
268
+ if (foundHelm) {
269
+ const existingGenType = entities.find(e => e.type === 'generation_type');
270
+ if (existingGenType) {
271
+ existingGenType.value = 'helm';
272
+ }
273
+ else {
274
+ entities.push({ type: 'generation_type', value: 'helm', confidence: 0.85 });
275
+ }
276
+ }
277
+ // Component extraction (cloud infrastructure)
278
+ const components = [
279
+ 'vpc',
280
+ 'eks',
281
+ 'kubernetes',
282
+ 'k8s',
283
+ 'rds',
284
+ 'database',
285
+ 's3',
286
+ 'storage',
287
+ 'bucket',
288
+ ];
289
+ for (const component of components) {
290
+ if (input.includes(component)) {
291
+ if (foundK8sWorkload && (component === 'kubernetes' || component === 'k8s')) {
292
+ continue;
293
+ }
294
+ let normalizedComponent = component;
295
+ const genTypeEntity = entities.find(e => e.type === 'generation_type');
296
+ const isK8sGeneration = genTypeEntity && (genTypeEntity.value === 'kubernetes' || genTypeEntity.value === 'helm');
297
+ if (component === 'k8s' || component === 'kubernetes') {
298
+ normalizedComponent = isK8sGeneration ? 'kubernetes' : 'eks';
299
+ }
300
+ if (component === 'database') {
301
+ normalizedComponent = 'rds';
302
+ }
303
+ if (component === 'storage' || component === 'bucket') {
304
+ normalizedComponent = 's3';
305
+ }
306
+ if (!entities.some(e => e.type === 'component' && e.value === normalizedComponent)) {
307
+ entities.push({ type: 'component', value: normalizedComponent, confidence: 0.8 });
308
+ }
309
+ }
310
+ }
311
+ // Environment extraction
312
+ const environments = ['production', 'staging', 'development', 'dev', 'prod', 'test'];
313
+ for (const env of environments) {
314
+ if (input.includes(env)) {
315
+ let normalizedEnv = env;
316
+ if (env === 'dev') {
317
+ normalizedEnv = 'development';
318
+ }
319
+ if (env === 'prod') {
320
+ normalizedEnv = 'production';
321
+ }
322
+ entities.push({ type: 'environment', value: normalizedEnv, confidence: 0.85 });
323
+ break;
324
+ }
325
+ }
326
+ // Region extraction
327
+ const regionPattern = /\b(us-east-1|us-west-2|eu-west-1|eu-central-1|ap-southeast-1|ap-northeast-1)\b/;
328
+ const regionMatch = input.match(regionPattern);
329
+ if (regionMatch) {
330
+ entities.push({ type: 'region', value: regionMatch[0], confidence: 0.95 });
331
+ }
332
+ return entities;
333
+ }
334
+ /**
335
+ * Initialize NLU patterns
336
+ */
337
+ initializePatterns() {
338
+ return [
339
+ // Generate Helm chart patterns
340
+ {
341
+ pattern: /(?:create|generate|build)\s+(?:a|an)?\s*helm\s+chart/i,
342
+ intent: 'generate',
343
+ entities: [{ type: 'generation_type', extractor: () => 'helm' }],
344
+ },
345
+ // Generate Kubernetes resource patterns
346
+ {
347
+ pattern: /(?:create|generate|build|deploy)\s+(?:a|an)?\s*(deployment|pod|service|statefulset|daemonset|cronjob|ingress)/i,
348
+ intent: 'generate',
349
+ entities: [
350
+ { type: 'component', extractor: match => match[1].toLowerCase() },
351
+ { type: 'generation_type', extractor: () => 'kubernetes' },
352
+ ],
353
+ },
354
+ // Generate infrastructure patterns
355
+ {
356
+ pattern: /(?:create|generate|build|setup)\s+(?:a|an)?\s*(vpc|eks|rds|s3|kubernetes|k8s)(?:\s+on|\s+in)?\s+(aws|gcp|azure)?/i,
357
+ intent: 'generate',
358
+ entities: [
359
+ {
360
+ type: 'component',
361
+ extractor: match => {
362
+ const c = match[1].toLowerCase();
363
+ return c === 'k8s' || c === 'kubernetes' ? 'eks' : c;
364
+ },
365
+ },
366
+ { type: 'provider', extractor: match => match[2]?.toLowerCase() || 'aws' },
367
+ ],
368
+ },
369
+ {
370
+ pattern: /(?:create|generate|build|setup)\s+(?:a|an)?\s*(production|staging|development)\s+environment/i,
371
+ intent: 'generate',
372
+ entities: [{ type: 'environment', extractor: match => match[1].toLowerCase() }],
373
+ },
374
+ {
375
+ pattern: /(?:i need|i want|can you create)\s+(?:a|an)?\s*(vpc|eks|rds|s3)/i,
376
+ intent: 'generate',
377
+ entities: [{ type: 'component', extractor: match => match[1].toLowerCase() }],
378
+ },
379
+ {
380
+ pattern: /deploy\s+(?:a|an)?\s*(.+?)\s+(?:on|to|in)\s+(aws|gcp|azure)/i,
381
+ intent: 'generate',
382
+ entities: [
383
+ { type: 'component', extractor: match => match[1].toLowerCase().trim() },
384
+ { type: 'provider', extractor: match => match[2].toLowerCase() },
385
+ ],
386
+ },
387
+ // Modify patterns
388
+ {
389
+ pattern: /(?:change|modify|update|edit)\s+(?:the|my)?\s*(vpc|eks|rds|s3)/i,
390
+ intent: 'modify',
391
+ entities: [{ type: 'component', extractor: match => match[1].toLowerCase() }],
392
+ },
393
+ {
394
+ pattern: /(?:add|enable|disable|remove)\s+(.+?)\s+(?:to|from|for|in)\s+(?:the|my)?\s*(vpc|eks|rds|s3)/i,
395
+ intent: 'modify',
396
+ entities: [
397
+ { type: 'action', extractor: match => match[1].toLowerCase() },
398
+ { type: 'component', extractor: match => match[2].toLowerCase() },
399
+ ],
400
+ },
401
+ // Explain patterns
402
+ {
403
+ pattern: /(?:what|explain|describe|tell me about)\s+(?:is|are)?\s*(?:a|an|the)?\s*(vpc|eks|rds|s3|terraform|kubernetes|helm|deployment|statefulset|ingress)/i,
404
+ intent: 'explain',
405
+ entities: [{ type: 'topic', extractor: match => match[1].toLowerCase() }],
406
+ },
407
+ {
408
+ pattern: /(?:why|how)\s+(?:do|does|should|would)\s+(?:i|we)?\s*(.+)/i,
409
+ intent: 'explain',
410
+ entities: [{ type: 'question', extractor: match => match[1].toLowerCase() }],
411
+ },
412
+ // Help patterns
413
+ { pattern: /(?:help|assist|guide|support|how to)/i, intent: 'help' },
414
+ {
415
+ pattern: /(?:what can you do|what are your capabilities|show me what you can do)/i,
416
+ intent: 'help',
417
+ },
418
+ ];
419
+ }
420
+ }