@build-astron-co/nimbus 0.2.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 (469) hide show
  1. package/bin/nimbus +26 -10
  2. package/bin/nimbus.cmd +41 -0
  3. package/bin/nimbus.mjs +70 -0
  4. package/completions/nimbus.bash +38 -0
  5. package/completions/nimbus.fish +48 -0
  6. package/completions/nimbus.zsh +81 -0
  7. package/dist/src/agent/compaction-agent.js +215 -0
  8. package/dist/src/agent/context-manager.js +385 -0
  9. package/dist/src/agent/context.js +322 -0
  10. package/dist/src/agent/deploy-preview.js +395 -0
  11. package/dist/src/agent/expand-files.js +95 -0
  12. package/dist/src/agent/index.js +18 -0
  13. package/dist/src/agent/loop.js +1535 -0
  14. package/dist/src/agent/modes.js +347 -0
  15. package/dist/src/agent/permissions.js +396 -0
  16. package/dist/src/agent/subagents/base.js +67 -0
  17. package/dist/src/agent/subagents/cost.js +45 -0
  18. package/dist/src/agent/subagents/explore.js +36 -0
  19. package/dist/src/agent/subagents/general.js +41 -0
  20. package/dist/src/agent/subagents/index.js +88 -0
  21. package/dist/src/agent/subagents/infra.js +52 -0
  22. package/dist/src/agent/subagents/security.js +60 -0
  23. package/dist/src/agent/system-prompt.js +860 -0
  24. package/dist/src/app.js +152 -0
  25. package/dist/src/audit/activity-log.js +209 -0
  26. package/dist/src/audit/compliance-checker.js +419 -0
  27. package/dist/src/audit/cost-tracker.js +231 -0
  28. package/dist/src/audit/index.js +10 -0
  29. package/dist/src/audit/security-scanner.js +490 -0
  30. package/dist/src/auth/guard.js +64 -0
  31. package/dist/src/auth/index.js +19 -0
  32. package/dist/src/auth/keychain.js +79 -0
  33. package/dist/src/auth/oauth.js +389 -0
  34. package/dist/src/auth/providers.js +415 -0
  35. package/dist/src/auth/sso.js +87 -0
  36. package/dist/src/auth/store.js +424 -0
  37. package/dist/src/auth/types.js +5 -0
  38. package/dist/src/cli/index.js +8 -0
  39. package/dist/src/cli/init.js +1048 -0
  40. package/dist/src/cli/openapi-spec.js +346 -0
  41. package/dist/src/cli/run.js +505 -0
  42. package/dist/src/cli/serve-auth.js +56 -0
  43. package/dist/src/cli/serve.js +432 -0
  44. package/dist/src/cli/web.js +50 -0
  45. package/dist/src/cli.js +1574 -0
  46. package/dist/src/clients/core-engine-client.js +156 -0
  47. package/dist/src/clients/enterprise-client.js +246 -0
  48. package/dist/src/clients/generator-client.js +219 -0
  49. package/dist/src/clients/git-client.js +367 -0
  50. package/dist/src/clients/github-client.js +229 -0
  51. package/dist/src/clients/helm-client.js +299 -0
  52. package/dist/src/clients/index.js +18 -0
  53. package/dist/src/clients/k8s-client.js +270 -0
  54. package/dist/src/clients/llm-client.js +119 -0
  55. package/dist/src/clients/rest-client.js +104 -0
  56. package/dist/src/clients/service-discovery.js +35 -0
  57. package/dist/src/clients/terraform-client.js +302 -0
  58. package/dist/src/clients/tools-client.js +1227 -0
  59. package/dist/src/clients/ws-client.js +93 -0
  60. package/dist/src/commands/alias.js +91 -0
  61. package/dist/src/commands/analyze/index.js +313 -0
  62. package/dist/src/commands/apply/helm.js +375 -0
  63. package/dist/src/commands/apply/index.js +176 -0
  64. package/dist/src/commands/apply/k8s.js +350 -0
  65. package/dist/src/commands/apply/terraform.js +465 -0
  66. package/dist/src/commands/ask.js +137 -0
  67. package/dist/src/commands/audit/index.js +322 -0
  68. package/dist/src/commands/auth-cloud.js +345 -0
  69. package/dist/src/commands/auth-list.js +112 -0
  70. package/dist/src/commands/auth-profile.js +104 -0
  71. package/dist/src/commands/auth-refresh.js +161 -0
  72. package/dist/src/commands/auth-status.js +122 -0
  73. package/dist/src/commands/aws/ec2.js +402 -0
  74. package/dist/src/commands/aws/iam.js +304 -0
  75. package/dist/src/commands/aws/index.js +108 -0
  76. package/dist/src/commands/aws/lambda.js +317 -0
  77. package/dist/src/commands/aws/rds.js +345 -0
  78. package/dist/src/commands/aws/s3.js +346 -0
  79. package/dist/src/commands/aws/vpc.js +302 -0
  80. package/dist/src/commands/aws-discover.js +413 -0
  81. package/dist/src/commands/aws-terraform.js +618 -0
  82. package/dist/src/commands/azure/aks.js +305 -0
  83. package/dist/src/commands/azure/functions.js +200 -0
  84. package/dist/src/commands/azure/index.js +93 -0
  85. package/dist/src/commands/azure/storage.js +378 -0
  86. package/dist/src/commands/azure/vm.js +291 -0
  87. package/dist/src/commands/billing/index.js +224 -0
  88. package/dist/src/commands/chat.js +259 -0
  89. package/dist/src/commands/completions.js +255 -0
  90. package/dist/src/commands/config.js +291 -0
  91. package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
  92. package/dist/src/commands/cost/estimator.js +73 -0
  93. package/dist/src/commands/cost/index.js +625 -0
  94. package/dist/src/commands/cost/parsers/terraform.js +234 -0
  95. package/dist/src/commands/cost/parsers/types.js +4 -0
  96. package/dist/src/commands/cost/pricing/aws.js +501 -0
  97. package/dist/src/commands/cost/pricing/azure.js +462 -0
  98. package/dist/src/commands/cost/pricing/gcp.js +359 -0
  99. package/dist/src/commands/cost/pricing/index.js +24 -0
  100. package/dist/src/commands/demo.js +196 -0
  101. package/dist/src/commands/deploy.js +215 -0
  102. package/dist/src/commands/doctor.js +1291 -0
  103. package/dist/src/commands/drift/index.js +674 -0
  104. package/dist/src/commands/explain.js +235 -0
  105. package/dist/src/commands/export.js +120 -0
  106. package/dist/src/commands/feedback.js +319 -0
  107. package/dist/src/commands/fix.js +263 -0
  108. package/dist/src/commands/fs/index.js +338 -0
  109. package/dist/src/commands/gcp/compute.js +266 -0
  110. package/dist/src/commands/gcp/functions.js +221 -0
  111. package/dist/src/commands/gcp/gke.js +357 -0
  112. package/dist/src/commands/gcp/iam.js +295 -0
  113. package/dist/src/commands/gcp/index.js +105 -0
  114. package/dist/src/commands/gcp/storage.js +232 -0
  115. package/dist/src/commands/generate-helm.js +1026 -0
  116. package/dist/src/commands/generate-k8s.js +1263 -0
  117. package/dist/src/commands/generate-terraform.js +1058 -0
  118. package/dist/src/commands/gh/index.js +663 -0
  119. package/dist/src/commands/git/index.js +1208 -0
  120. package/dist/src/commands/helm/index.js +985 -0
  121. package/dist/src/commands/help.js +639 -0
  122. package/dist/src/commands/history.js +120 -0
  123. package/dist/src/commands/import.js +782 -0
  124. package/dist/src/commands/incident.js +144 -0
  125. package/dist/src/commands/index.js +109 -0
  126. package/dist/src/commands/init.js +955 -0
  127. package/dist/src/commands/k8s/index.js +979 -0
  128. package/dist/src/commands/login.js +588 -0
  129. package/dist/src/commands/logout.js +61 -0
  130. package/dist/src/commands/logs.js +160 -0
  131. package/dist/src/commands/onboarding.js +382 -0
  132. package/dist/src/commands/pipeline.js +153 -0
  133. package/dist/src/commands/plan/display.js +216 -0
  134. package/dist/src/commands/plan/index.js +525 -0
  135. package/dist/src/commands/plugin.js +325 -0
  136. package/dist/src/commands/preview.js +356 -0
  137. package/dist/src/commands/profile.js +297 -0
  138. package/dist/src/commands/questionnaire.js +1021 -0
  139. package/dist/src/commands/resume.js +35 -0
  140. package/dist/src/commands/rollback.js +259 -0
  141. package/dist/src/commands/rollout.js +74 -0
  142. package/dist/src/commands/runbook.js +307 -0
  143. package/dist/src/commands/schedule.js +202 -0
  144. package/dist/src/commands/status.js +213 -0
  145. package/dist/src/commands/team/index.js +309 -0
  146. package/dist/src/commands/team-context.js +200 -0
  147. package/dist/src/commands/template.js +204 -0
  148. package/dist/src/commands/tf/index.js +989 -0
  149. package/dist/src/commands/upgrade.js +515 -0
  150. package/dist/src/commands/usage/index.js +118 -0
  151. package/dist/src/commands/version.js +145 -0
  152. package/dist/src/commands/watch.js +127 -0
  153. package/dist/src/compat/index.js +2 -0
  154. package/dist/src/compat/runtime.js +10 -0
  155. package/dist/src/compat/sqlite.js +144 -0
  156. package/dist/src/config/index.js +6 -0
  157. package/dist/src/config/manager.js +469 -0
  158. package/dist/src/config/mode-store.js +57 -0
  159. package/dist/src/config/profiles.js +66 -0
  160. package/dist/src/config/safety-policy.js +251 -0
  161. package/dist/src/config/schema.js +107 -0
  162. package/dist/src/config/types.js +311 -0
  163. package/dist/src/config/workspace-state.js +38 -0
  164. package/dist/src/context/context-db.js +138 -0
  165. package/dist/src/demo/index.js +295 -0
  166. package/dist/src/demo/scenarios/full-journey.js +226 -0
  167. package/dist/src/demo/scenarios/getting-started.js +124 -0
  168. package/dist/src/demo/scenarios/helm-release.js +334 -0
  169. package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
  170. package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
  171. package/dist/src/demo/types.js +6 -0
  172. package/dist/src/engine/cost-estimator.js +334 -0
  173. package/dist/src/engine/diagram-generator.js +192 -0
  174. package/dist/src/engine/drift-detector.js +688 -0
  175. package/dist/src/engine/executor.js +832 -0
  176. package/dist/src/engine/index.js +39 -0
  177. package/dist/src/engine/orchestrator.js +436 -0
  178. package/dist/src/engine/planner.js +616 -0
  179. package/dist/src/engine/safety.js +609 -0
  180. package/dist/src/engine/verifier.js +664 -0
  181. package/dist/src/enterprise/audit.js +241 -0
  182. package/dist/src/enterprise/auth.js +189 -0
  183. package/dist/src/enterprise/billing.js +512 -0
  184. package/dist/src/enterprise/index.js +16 -0
  185. package/dist/src/enterprise/teams.js +315 -0
  186. package/dist/src/generator/best-practices.js +1375 -0
  187. package/dist/src/generator/helm.js +495 -0
  188. package/dist/src/generator/index.js +11 -0
  189. package/dist/src/generator/intent-parser.js +420 -0
  190. package/dist/src/generator/kubernetes.js +773 -0
  191. package/dist/src/generator/terraform.js +1472 -0
  192. package/dist/src/history/index.js +6 -0
  193. package/dist/src/history/manager.js +199 -0
  194. package/dist/src/history/types.js +6 -0
  195. package/dist/src/hooks/config.js +318 -0
  196. package/dist/src/hooks/engine.js +317 -0
  197. package/dist/src/hooks/index.js +2 -0
  198. package/dist/src/llm/auth-bridge.js +157 -0
  199. package/dist/src/llm/circuit-breaker.js +116 -0
  200. package/dist/src/llm/config-loader.js +172 -0
  201. package/dist/src/llm/cost-calculator.js +137 -0
  202. package/dist/src/llm/index.js +7 -0
  203. package/dist/src/llm/model-aliases.js +99 -0
  204. package/dist/src/llm/provider-registry.js +57 -0
  205. package/dist/src/llm/providers/anthropic.js +430 -0
  206. package/dist/src/llm/providers/bedrock.js +409 -0
  207. package/dist/src/llm/providers/google.js +344 -0
  208. package/dist/src/llm/providers/ollama.js +661 -0
  209. package/dist/src/llm/providers/openai-compatible.js +289 -0
  210. package/dist/src/llm/providers/openai.js +284 -0
  211. package/dist/src/llm/providers/openrouter.js +293 -0
  212. package/dist/src/llm/router.js +844 -0
  213. package/dist/src/llm/types.js +69 -0
  214. package/dist/src/lsp/client.js +239 -0
  215. package/dist/src/lsp/languages.js +95 -0
  216. package/dist/src/lsp/manager.js +243 -0
  217. package/dist/src/mcp/client.js +289 -0
  218. package/dist/src/mcp/index.js +5 -0
  219. package/dist/src/mcp/manager.js +113 -0
  220. package/dist/src/nimbus.js +212 -0
  221. package/dist/src/plugins/index.js +13 -0
  222. package/dist/src/plugins/loader.js +280 -0
  223. package/dist/src/plugins/manager.js +282 -0
  224. package/dist/src/plugins/types.js +23 -0
  225. package/dist/src/scanners/cicd-scanner.js +230 -0
  226. package/dist/src/scanners/cloud-scanner.js +415 -0
  227. package/dist/src/scanners/framework-scanner.js +430 -0
  228. package/dist/src/scanners/iac-scanner.js +350 -0
  229. package/dist/src/scanners/index.js +454 -0
  230. package/dist/src/scanners/language-scanner.js +258 -0
  231. package/dist/src/scanners/package-manager-scanner.js +252 -0
  232. package/dist/src/scanners/types.js +6 -0
  233. package/dist/src/sessions/manager.js +395 -0
  234. package/dist/src/sessions/types.js +4 -0
  235. package/dist/src/sharing/sync.js +238 -0
  236. package/dist/src/sharing/viewer.js +131 -0
  237. package/dist/src/snapshots/index.js +1 -0
  238. package/dist/src/snapshots/manager.js +432 -0
  239. package/dist/src/state/artifacts.js +94 -0
  240. package/dist/src/state/audit.js +73 -0
  241. package/dist/src/state/billing.js +126 -0
  242. package/dist/src/state/checkpoints.js +81 -0
  243. package/dist/src/state/config.js +58 -0
  244. package/dist/src/state/conversations.js +7 -0
  245. package/dist/src/state/credentials.js +96 -0
  246. package/dist/src/state/db.js +53 -0
  247. package/dist/src/state/index.js +23 -0
  248. package/dist/src/state/messages.js +76 -0
  249. package/dist/src/state/projects.js +92 -0
  250. package/dist/src/state/schema.js +233 -0
  251. package/dist/src/state/sessions.js +79 -0
  252. package/dist/src/state/teams.js +131 -0
  253. package/dist/src/telemetry.js +91 -0
  254. package/dist/src/tools/aws-ops.js +747 -0
  255. package/dist/src/tools/azure-ops.js +491 -0
  256. package/dist/src/tools/file-ops.js +451 -0
  257. package/dist/src/tools/gcp-ops.js +559 -0
  258. package/dist/src/tools/git-ops.js +557 -0
  259. package/dist/src/tools/github-ops.js +460 -0
  260. package/dist/src/tools/helm-ops.js +634 -0
  261. package/dist/src/tools/index.js +16 -0
  262. package/dist/src/tools/k8s-ops.js +579 -0
  263. package/dist/src/tools/schemas/converter.js +129 -0
  264. package/dist/src/tools/schemas/devops.js +3319 -0
  265. package/dist/src/tools/schemas/index.js +19 -0
  266. package/dist/src/tools/schemas/standard.js +966 -0
  267. package/dist/src/tools/schemas/types.js +409 -0
  268. package/dist/src/tools/spawn-exec.js +109 -0
  269. package/dist/src/tools/terraform-ops.js +627 -0
  270. package/dist/src/types/config.js +1 -0
  271. package/dist/src/types/drift.js +4 -0
  272. package/dist/src/types/enterprise.js +5 -0
  273. package/dist/src/types/index.js +14 -0
  274. package/dist/src/types/plan.js +1 -0
  275. package/dist/src/types/request.js +1 -0
  276. package/dist/src/types/response.js +1 -0
  277. package/dist/src/types/service.js +1 -0
  278. package/dist/src/ui/App.js +1672 -0
  279. package/dist/src/ui/DeployPreview.js +60 -0
  280. package/dist/src/ui/FileDiffModal.js +108 -0
  281. package/dist/src/ui/Header.js +46 -0
  282. package/dist/src/ui/HelpModal.js +9 -0
  283. package/dist/src/ui/InputBox.js +408 -0
  284. package/dist/src/ui/MessageList.js +795 -0
  285. package/dist/src/ui/PermissionPrompt.js +72 -0
  286. package/dist/src/ui/StatusBar.js +109 -0
  287. package/dist/src/ui/TerminalPane.js +31 -0
  288. package/dist/src/ui/ToolCallDisplay.js +303 -0
  289. package/dist/src/ui/TreePane.js +83 -0
  290. package/dist/src/ui/chat-ui.js +721 -0
  291. package/dist/src/ui/index.js +11 -0
  292. package/dist/src/ui/ink/index.js +1325 -0
  293. package/dist/src/ui/streaming.js +137 -0
  294. package/dist/src/ui/theme.js +78 -0
  295. package/dist/src/ui/types.js +7 -0
  296. package/dist/src/utils/analytics.js +61 -0
  297. package/dist/src/utils/cost-warning.js +25 -0
  298. package/dist/src/utils/env.js +42 -0
  299. package/dist/src/utils/errors.js +54 -0
  300. package/dist/src/utils/event-bus.js +22 -0
  301. package/dist/src/utils/index.js +16 -0
  302. package/dist/src/utils/logger.js +150 -0
  303. package/dist/src/utils/rate-limiter.js +90 -0
  304. package/dist/src/utils/service-auth.js +36 -0
  305. package/dist/src/utils/validation.js +39 -0
  306. package/dist/src/version.js +3 -0
  307. package/dist/src/watcher/index.js +192 -0
  308. package/dist/src/wizard/approval.js +275 -0
  309. package/dist/src/wizard/index.js +13 -0
  310. package/dist/src/wizard/prompts.js +273 -0
  311. package/dist/src/wizard/types.js +4 -0
  312. package/dist/src/wizard/ui.js +453 -0
  313. package/dist/src/wizard/wizard.js +227 -0
  314. package/package.json +31 -23
  315. package/src/__tests__/alias.test.ts +133 -0
  316. package/src/__tests__/app.test.ts +1 -1
  317. package/src/__tests__/audit.test.ts +1 -1
  318. package/src/__tests__/circuit-breaker.test.ts +1 -1
  319. package/src/__tests__/cli-run.test.ts +237 -1
  320. package/src/__tests__/compat-sqlite.test.ts +68 -0
  321. package/src/__tests__/context-manager.test.ts +131 -1
  322. package/src/__tests__/context.test.ts +1 -1
  323. package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
  324. package/src/__tests__/doctor.test.ts +48 -0
  325. package/src/__tests__/enterprise.test.ts +1 -1
  326. package/src/__tests__/export.test.ts +236 -0
  327. package/src/__tests__/gap-11-18-20.test.ts +958 -0
  328. package/src/__tests__/generator.test.ts +1 -1
  329. package/src/__tests__/helm-streaming.test.ts +127 -0
  330. package/src/__tests__/hooks.test.ts +1 -1
  331. package/src/__tests__/incident.test.ts +179 -0
  332. package/src/__tests__/init.test.ts +55 -4
  333. package/src/__tests__/intent-parser.test.ts +1 -1
  334. package/src/__tests__/llm-router.test.ts +1 -1
  335. package/src/__tests__/logs.test.ts +107 -0
  336. package/src/__tests__/loop-errors.test.ts +244 -0
  337. package/src/__tests__/lsp.test.ts +1 -1
  338. package/src/__tests__/modes.test.ts +1 -1
  339. package/src/__tests__/perf-optimizations.test.ts +847 -0
  340. package/src/__tests__/permissions.test.ts +1 -1
  341. package/src/__tests__/pipeline.test.ts +50 -0
  342. package/src/__tests__/polish-phase3.test.ts +340 -0
  343. package/src/__tests__/profile.test.ts +237 -0
  344. package/src/__tests__/rollback.test.ts +83 -0
  345. package/src/__tests__/runbook.test.ts +219 -0
  346. package/src/__tests__/schedule.test.ts +206 -0
  347. package/src/__tests__/serve.test.ts +1 -1
  348. package/src/__tests__/sessions.test.ts +96 -1
  349. package/src/__tests__/sharing.test.ts +53 -1
  350. package/src/__tests__/snapshots.test.ts +1 -1
  351. package/src/__tests__/standalone-migration.test.ts +199 -0
  352. package/src/__tests__/state-db.test.ts +1 -1
  353. package/src/__tests__/status.test.ts +158 -0
  354. package/src/__tests__/stream-with-tools.test.ts +71 -25
  355. package/src/__tests__/subagents.test.ts +1 -1
  356. package/src/__tests__/system-prompt.test.ts +82 -3
  357. package/src/__tests__/terminal-gap-v2.test.ts +395 -0
  358. package/src/__tests__/terminal-parity.test.ts +393 -0
  359. package/src/__tests__/tf-apply.test.ts +187 -0
  360. package/src/__tests__/tool-converter.test.ts +1 -1
  361. package/src/__tests__/tool-schemas.test.ts +209 -4
  362. package/src/__tests__/tools.test.ts +4 -3
  363. package/src/__tests__/version-json.test.ts +184 -0
  364. package/src/__tests__/version.test.ts +1 -1
  365. package/src/__tests__/watch.test.ts +129 -0
  366. package/src/agent/compaction-agent.ts +40 -1
  367. package/src/agent/context-manager.ts +67 -3
  368. package/src/agent/deploy-preview.ts +62 -1
  369. package/src/agent/expand-files.ts +108 -0
  370. package/src/agent/loop.ts +1312 -31
  371. package/src/agent/permissions.ts +51 -4
  372. package/src/agent/system-prompt.ts +573 -19
  373. package/src/app.ts +58 -0
  374. package/src/audit/security-scanner.ts +45 -0
  375. package/src/auth/keychain.ts +82 -0
  376. package/src/auth/oauth.ts +15 -5
  377. package/src/cli/init.ts +378 -5
  378. package/src/cli/run.ts +407 -16
  379. package/src/cli/serve.ts +78 -1
  380. package/src/cli/web.ts +10 -6
  381. package/src/cli.ts +312 -1
  382. package/src/clients/service-discovery.ts +30 -25
  383. package/src/commands/alias.ts +100 -0
  384. package/src/commands/audit/index.ts +121 -2
  385. package/src/commands/auth-cloud.ts +113 -0
  386. package/src/commands/auth-refresh.ts +187 -0
  387. package/src/commands/aws-discover.ts +144 -251
  388. package/src/commands/aws-terraform.ts +68 -118
  389. package/src/commands/chat.ts +9 -3
  390. package/src/commands/completions.ts +268 -0
  391. package/src/commands/config.ts +26 -0
  392. package/src/commands/cost/index.ts +218 -2
  393. package/src/commands/deploy.ts +260 -0
  394. package/src/commands/doctor.ts +744 -152
  395. package/src/commands/drift/index.ts +371 -23
  396. package/src/commands/export.ts +146 -0
  397. package/src/commands/generate-k8s.ts +9 -61
  398. package/src/commands/generate-terraform.ts +191 -449
  399. package/src/commands/help.ts +212 -36
  400. package/src/commands/history.ts +8 -1
  401. package/src/commands/incident.ts +166 -0
  402. package/src/commands/init.ts +5 -0
  403. package/src/commands/login.ts +86 -1
  404. package/src/commands/logs.ts +167 -0
  405. package/src/commands/onboarding.ts +211 -34
  406. package/src/commands/pipeline.ts +186 -0
  407. package/src/commands/plugin.ts +398 -0
  408. package/src/commands/profile.ts +342 -0
  409. package/src/commands/questionnaire.ts +0 -98
  410. package/src/commands/resume.ts +26 -34
  411. package/src/commands/rollback.ts +315 -0
  412. package/src/commands/rollout.ts +88 -0
  413. package/src/commands/runbook.ts +346 -0
  414. package/src/commands/schedule.ts +236 -0
  415. package/src/commands/status.ts +252 -0
  416. package/src/commands/team-context.ts +220 -0
  417. package/src/commands/template.ts +58 -57
  418. package/src/commands/tf/index.ts +70 -11
  419. package/src/commands/upgrade.ts +57 -0
  420. package/src/commands/version.ts +54 -50
  421. package/src/commands/watch.ts +153 -0
  422. package/src/compat/runtime.ts +1 -1
  423. package/src/compat/sqlite.ts +75 -5
  424. package/src/config/mode-store.ts +62 -0
  425. package/src/config/profiles.ts +84 -0
  426. package/src/config/types.ts +83 -1
  427. package/src/config/workspace-state.ts +53 -0
  428. package/src/engine/cost-estimator.ts +52 -10
  429. package/src/engine/executor.ts +33 -2
  430. package/src/engine/planner.ts +68 -1
  431. package/src/generator/terraform.ts +8 -0
  432. package/src/history/manager.ts +2 -74
  433. package/src/hooks/engine.ts +5 -4
  434. package/src/llm/cost-calculator.ts +2 -2
  435. package/src/llm/providers/anthropic.ts +50 -21
  436. package/src/llm/router.ts +76 -7
  437. package/src/lsp/languages.ts +3 -0
  438. package/src/lsp/manager.ts +21 -5
  439. package/src/nimbus.ts +37 -18
  440. package/src/sessions/manager.ts +108 -1
  441. package/src/sharing/sync.ts +4 -0
  442. package/src/sharing/viewer.ts +66 -0
  443. package/src/tools/file-ops.ts +22 -0
  444. package/src/tools/schemas/devops.ts +3007 -117
  445. package/src/tools/schemas/standard.ts +5 -1
  446. package/src/tools/schemas/types.ts +31 -1
  447. package/src/tools/spawn-exec.ts +148 -0
  448. package/src/ui/App.tsx +1183 -66
  449. package/src/ui/DeployPreview.tsx +62 -57
  450. package/src/ui/FileDiffModal.tsx +162 -0
  451. package/src/ui/Header.tsx +87 -24
  452. package/src/ui/HelpModal.tsx +57 -0
  453. package/src/ui/InputBox.tsx +163 -10
  454. package/src/ui/MessageList.tsx +487 -40
  455. package/src/ui/PermissionPrompt.tsx +17 -5
  456. package/src/ui/StatusBar.tsx +122 -3
  457. package/src/ui/TerminalPane.tsx +84 -0
  458. package/src/ui/ToolCallDisplay.tsx +252 -18
  459. package/src/ui/TreePane.tsx +132 -0
  460. package/src/ui/chat-ui.ts +41 -44
  461. package/src/ui/ink/index.ts +771 -38
  462. package/src/ui/streaming.ts +1 -1
  463. package/src/ui/theme.ts +104 -0
  464. package/src/ui/types.ts +18 -0
  465. package/src/version.ts +1 -1
  466. package/src/watcher/index.ts +66 -15
  467. package/src/wizard/types.ts +1 -0
  468. package/src/wizard/ui.ts +1 -1
  469. package/tsconfig.json +2 -2
@@ -0,0 +1,491 @@
1
+ /**
2
+ * Azure Operations — Embedded tool (stripped HTTP wrappers)
3
+ *
4
+ * Merged from services/azure-tools-service/src/azure/compute.ts, storage.ts, aks.ts, iam.ts, network.ts
5
+ * Uses lazy imports for Azure SDK to keep binary size small.
6
+ */
7
+ import { logger } from '../utils';
8
+ /**
9
+ * Unified Azure Operations class merging Compute, Storage, AKS, IAM, and Network operations.
10
+ * All Azure SDK imports are lazy to minimize binary size.
11
+ */
12
+ export class AzureOperations {
13
+ subscriptionId;
14
+ constructor(config = {}) {
15
+ this.subscriptionId = config.subscriptionId || process.env.AZURE_SUBSCRIPTION_ID || '';
16
+ }
17
+ /**
18
+ * Lazily create an Azure credential
19
+ */
20
+ async getCredential() {
21
+ const { DefaultAzureCredential } = await import('@azure/identity');
22
+ return new DefaultAzureCredential();
23
+ }
24
+ // ==========================================
25
+ // Compute (VM) Operations
26
+ // ==========================================
27
+ /**
28
+ * List virtual machines, optionally filtered by resource group
29
+ */
30
+ async listVMs(subscriptionId, resourceGroup) {
31
+ try {
32
+ const subId = subscriptionId || this.subscriptionId;
33
+ if (!subId) {
34
+ return { success: false, error: 'No subscription ID provided' };
35
+ }
36
+ const { ComputeManagementClient } = await import('@azure/arm-compute');
37
+ const credential = await this.getCredential();
38
+ const client = new ComputeManagementClient(credential, subId);
39
+ const vms = [];
40
+ if (resourceGroup) {
41
+ for await (const vm of client.virtualMachines.list(resourceGroup)) {
42
+ vms.push(this.mapVM(vm));
43
+ }
44
+ }
45
+ else {
46
+ for await (const vm of client.virtualMachines.listAll()) {
47
+ vms.push(this.mapVM(vm));
48
+ }
49
+ }
50
+ logger.debug(`Listed ${vms.length} VMs`, { resourceGroup });
51
+ return { success: true, data: { vms, count: vms.length } };
52
+ }
53
+ catch (error) {
54
+ logger.error('Failed to list VMs', error);
55
+ return { success: false, error: error.message || 'Failed to list VMs' };
56
+ }
57
+ }
58
+ /**
59
+ * Start a virtual machine
60
+ */
61
+ async startVM(subscriptionId, resourceGroup, vmName) {
62
+ try {
63
+ const subId = subscriptionId || this.subscriptionId;
64
+ if (!subId) {
65
+ return { success: false, error: 'No subscription ID provided' };
66
+ }
67
+ const { ComputeManagementClient } = await import('@azure/arm-compute');
68
+ const credential = await this.getCredential();
69
+ const client = new ComputeManagementClient(credential, subId);
70
+ const poller = await client.virtualMachines.beginStart(resourceGroup, vmName);
71
+ await poller.pollUntilDone();
72
+ logger.info(`Started VM ${vmName} in ${resourceGroup}`);
73
+ return {
74
+ success: true,
75
+ data: { vmName, resourceGroup, action: 'start', status: 'succeeded' },
76
+ };
77
+ }
78
+ catch (error) {
79
+ logger.error('Failed to start VM', { vmName, resourceGroup, error });
80
+ return { success: false, error: error.message || 'Failed to start VM' };
81
+ }
82
+ }
83
+ /**
84
+ * Stop (deallocate) a virtual machine
85
+ */
86
+ async stopVM(subscriptionId, resourceGroup, vmName) {
87
+ try {
88
+ const subId = subscriptionId || this.subscriptionId;
89
+ if (!subId) {
90
+ return { success: false, error: 'No subscription ID provided' };
91
+ }
92
+ const { ComputeManagementClient } = await import('@azure/arm-compute');
93
+ const credential = await this.getCredential();
94
+ const client = new ComputeManagementClient(credential, subId);
95
+ const poller = await client.virtualMachines.beginDeallocate(resourceGroup, vmName);
96
+ await poller.pollUntilDone();
97
+ logger.info(`Stopped VM ${vmName} in ${resourceGroup}`);
98
+ return {
99
+ success: true,
100
+ data: { vmName, resourceGroup, action: 'stop', status: 'succeeded' },
101
+ };
102
+ }
103
+ catch (error) {
104
+ logger.error('Failed to stop VM', { vmName, resourceGroup, error });
105
+ return { success: false, error: error.message || 'Failed to stop VM' };
106
+ }
107
+ }
108
+ /**
109
+ * Map a VM to normalized format
110
+ */
111
+ mapVM(vm) {
112
+ return {
113
+ id: vm.id,
114
+ name: vm.name,
115
+ location: vm.location,
116
+ type: vm.type,
117
+ vmSize: vm.hardwareProfile?.vmSize,
118
+ osType: vm.storageProfile?.osDisk?.osType,
119
+ provisioningState: vm.provisioningState,
120
+ vmId: vm.vmId,
121
+ tags: vm.tags || {},
122
+ networkInterfaces: vm.networkProfile?.networkInterfaces?.map((nic) => ({
123
+ id: nic.id,
124
+ primary: nic.primary,
125
+ })),
126
+ availabilitySet: vm.availabilitySet?.id,
127
+ zones: vm.zones,
128
+ };
129
+ }
130
+ // ==========================================
131
+ // Storage Operations
132
+ // ==========================================
133
+ /**
134
+ * List storage accounts, optionally filtered by resource group
135
+ */
136
+ async listStorageAccounts(subscriptionId, resourceGroup) {
137
+ try {
138
+ const subId = subscriptionId || this.subscriptionId;
139
+ if (!subId) {
140
+ return { success: false, error: 'No subscription ID provided' };
141
+ }
142
+ const { StorageManagementClient } = await import('@azure/arm-storage');
143
+ const credential = await this.getCredential();
144
+ const client = new StorageManagementClient(credential, subId);
145
+ const accounts = [];
146
+ if (resourceGroup) {
147
+ for await (const account of client.storageAccounts.listByResourceGroup(resourceGroup)) {
148
+ accounts.push(this.mapStorageAccount(account));
149
+ }
150
+ }
151
+ else {
152
+ for await (const account of client.storageAccounts.list()) {
153
+ accounts.push(this.mapStorageAccount(account));
154
+ }
155
+ }
156
+ logger.debug(`Listed ${accounts.length} storage accounts`, { resourceGroup });
157
+ return { success: true, data: { accounts, count: accounts.length } };
158
+ }
159
+ catch (error) {
160
+ logger.error('Failed to list storage accounts', error);
161
+ return { success: false, error: error.message || 'Failed to list storage accounts' };
162
+ }
163
+ }
164
+ /**
165
+ * List blob containers for a storage account
166
+ */
167
+ async listContainers(subscriptionId, resourceGroup, accountName) {
168
+ try {
169
+ const subId = subscriptionId || this.subscriptionId;
170
+ if (!subId) {
171
+ return { success: false, error: 'No subscription ID provided' };
172
+ }
173
+ const { StorageManagementClient } = await import('@azure/arm-storage');
174
+ const credential = await this.getCredential();
175
+ const client = new StorageManagementClient(credential, subId);
176
+ const containers = [];
177
+ for await (const container of client.blobContainers.list(resourceGroup, accountName)) {
178
+ containers.push({
179
+ id: container.id,
180
+ name: container.name,
181
+ type: container.type,
182
+ publicAccess: container.publicAccess,
183
+ leaseState: container.leaseState,
184
+ leaseStatus: container.leaseStatus,
185
+ lastModifiedTime: container.lastModifiedTime,
186
+ hasImmutabilityPolicy: container.hasImmutabilityPolicy,
187
+ hasLegalHold: container.hasLegalHold,
188
+ defaultEncryptionScope: container.defaultEncryptionScope,
189
+ });
190
+ }
191
+ logger.debug(`Listed ${containers.length} containers for ${accountName}`);
192
+ return { success: true, data: { containers, count: containers.length } };
193
+ }
194
+ catch (error) {
195
+ logger.error('Failed to list containers', { accountName, error });
196
+ return { success: false, error: error.message || 'Failed to list containers' };
197
+ }
198
+ }
199
+ /**
200
+ * Map a storage account to normalized format
201
+ */
202
+ mapStorageAccount(account) {
203
+ return {
204
+ id: account.id,
205
+ name: account.name,
206
+ location: account.location,
207
+ type: account.type,
208
+ kind: account.kind,
209
+ sku: account.sku ? { name: account.sku.name, tier: account.sku.tier } : undefined,
210
+ provisioningState: account.provisioningState,
211
+ primaryEndpoints: account.primaryEndpoints,
212
+ creationTime: account.creationTime,
213
+ accessTier: account.accessTier,
214
+ enableHttpsTrafficOnly: account.enableHttpsTrafficOnly,
215
+ minimumTlsVersion: account.minimumTlsVersion,
216
+ allowBlobPublicAccess: account.allowBlobPublicAccess,
217
+ networkRuleSet: account.networkRuleSet
218
+ ? {
219
+ defaultAction: account.networkRuleSet.defaultAction,
220
+ bypass: account.networkRuleSet.bypass,
221
+ }
222
+ : undefined,
223
+ tags: account.tags || {},
224
+ };
225
+ }
226
+ // ==========================================
227
+ // AKS (Azure Kubernetes Service) Operations
228
+ // ==========================================
229
+ /**
230
+ * List AKS clusters, optionally filtered by resource group
231
+ */
232
+ async listClusters(subscriptionId, resourceGroup) {
233
+ try {
234
+ const subId = subscriptionId || this.subscriptionId;
235
+ if (!subId) {
236
+ return { success: false, error: 'No subscription ID provided' };
237
+ }
238
+ const { ContainerServiceClient } = await import('@azure/arm-containerservice');
239
+ const credential = await this.getCredential();
240
+ const client = new ContainerServiceClient(credential, subId);
241
+ const clusters = [];
242
+ if (resourceGroup) {
243
+ for await (const cluster of client.managedClusters.listByResourceGroup(resourceGroup)) {
244
+ clusters.push(this.mapAKSCluster(cluster));
245
+ }
246
+ }
247
+ else {
248
+ for await (const cluster of client.managedClusters.list()) {
249
+ clusters.push(this.mapAKSCluster(cluster));
250
+ }
251
+ }
252
+ logger.debug(`Listed ${clusters.length} AKS clusters`, { resourceGroup });
253
+ return { success: true, data: { clusters, count: clusters.length } };
254
+ }
255
+ catch (error) {
256
+ logger.error('Failed to list AKS clusters', error);
257
+ return { success: false, error: error.message || 'Failed to list AKS clusters' };
258
+ }
259
+ }
260
+ /**
261
+ * Get detailed information about a specific AKS cluster
262
+ */
263
+ async describeCluster(subscriptionId, resourceGroup, clusterName) {
264
+ try {
265
+ const subId = subscriptionId || this.subscriptionId;
266
+ if (!subId) {
267
+ return { success: false, error: 'No subscription ID provided' };
268
+ }
269
+ const { ContainerServiceClient } = await import('@azure/arm-containerservice');
270
+ const credential = await this.getCredential();
271
+ const client = new ContainerServiceClient(credential, subId);
272
+ const cluster = await client.managedClusters.get(resourceGroup, clusterName);
273
+ logger.debug(`Described AKS cluster ${clusterName}`);
274
+ return { success: true, data: this.mapAKSCluster(cluster) };
275
+ }
276
+ catch (error) {
277
+ logger.error('Failed to describe AKS cluster', { clusterName, error });
278
+ return { success: false, error: error.message || 'Failed to describe AKS cluster' };
279
+ }
280
+ }
281
+ /**
282
+ * Map an AKS cluster to a normalized response format
283
+ */
284
+ mapAKSCluster(cluster) {
285
+ return {
286
+ id: cluster.id,
287
+ name: cluster.name,
288
+ location: cluster.location,
289
+ type: cluster.type,
290
+ kubernetesVersion: cluster.kubernetesVersion,
291
+ dnsPrefix: cluster.dnsPrefix,
292
+ fqdn: cluster.fqdn,
293
+ provisioningState: cluster.provisioningState,
294
+ powerState: cluster.powerState?.code,
295
+ nodeResourceGroup: cluster.nodeResourceGroup,
296
+ enableRBAC: cluster.enableRBAC,
297
+ networkProfile: cluster.networkProfile
298
+ ? {
299
+ networkPlugin: cluster.networkProfile.networkPlugin,
300
+ networkPolicy: cluster.networkProfile.networkPolicy,
301
+ podCidr: cluster.networkProfile.podCidr,
302
+ serviceCidr: cluster.networkProfile.serviceCidr,
303
+ dnsServiceIP: cluster.networkProfile.dnsServiceIP,
304
+ loadBalancerSku: cluster.networkProfile.loadBalancerSku,
305
+ }
306
+ : undefined,
307
+ agentPoolProfiles: cluster.agentPoolProfiles?.map((pool) => ({
308
+ name: pool.name,
309
+ count: pool.count,
310
+ vmSize: pool.vmSize,
311
+ osType: pool.osType,
312
+ osDiskSizeGB: pool.osDiskSizeGB,
313
+ mode: pool.mode,
314
+ maxPods: pool.maxPods,
315
+ enableAutoScaling: pool.enableAutoScaling,
316
+ minCount: pool.minCount,
317
+ maxCount: pool.maxCount,
318
+ availabilityZones: pool.availabilityZones,
319
+ provisioningState: pool.provisioningState,
320
+ })),
321
+ identity: cluster.identity
322
+ ? {
323
+ type: cluster.identity.type,
324
+ principalId: cluster.identity.principalId,
325
+ tenantId: cluster.identity.tenantId,
326
+ }
327
+ : undefined,
328
+ tags: cluster.tags || {},
329
+ };
330
+ }
331
+ // ==========================================
332
+ // IAM (Role Assignments) Operations
333
+ // ==========================================
334
+ /**
335
+ * List role assignments for a subscription
336
+ */
337
+ async listRoleAssignments(subscriptionId) {
338
+ try {
339
+ const subId = subscriptionId || this.subscriptionId;
340
+ if (!subId) {
341
+ return { success: false, error: 'No subscription ID provided' };
342
+ }
343
+ const credential = await this.getCredential();
344
+ const token = await credential.getToken('https://management.azure.com/.default');
345
+ if (!token) {
346
+ return { success: false, error: 'Failed to acquire authentication token' };
347
+ }
348
+ const url = `https://management.azure.com/subscriptions/${subId}/providers/Microsoft.Authorization/roleAssignments?api-version=2022-04-01`;
349
+ const response = await fetch(url, {
350
+ headers: {
351
+ Authorization: `Bearer ${token.token}`,
352
+ 'Content-Type': 'application/json',
353
+ },
354
+ });
355
+ if (!response.ok) {
356
+ const errorText = await response.text();
357
+ return { success: false, error: `Azure API error: ${response.status} - ${errorText}` };
358
+ }
359
+ const data = (await response.json());
360
+ const roleAssignments = (data.value || []).map((ra) => ({
361
+ id: ra.id,
362
+ name: ra.name,
363
+ type: ra.type,
364
+ principalId: ra.properties?.principalId,
365
+ principalType: ra.properties?.principalType,
366
+ roleDefinitionId: ra.properties?.roleDefinitionId,
367
+ scope: ra.properties?.scope,
368
+ createdOn: ra.properties?.createdOn,
369
+ updatedOn: ra.properties?.updatedOn,
370
+ createdBy: ra.properties?.createdBy,
371
+ description: ra.properties?.description,
372
+ }));
373
+ logger.debug(`Listed ${roleAssignments.length} role assignments`);
374
+ return { success: true, data: { roleAssignments, count: roleAssignments.length } };
375
+ }
376
+ catch (error) {
377
+ logger.error('Failed to list role assignments', error);
378
+ return { success: false, error: error.message || 'Failed to list role assignments' };
379
+ }
380
+ }
381
+ // ==========================================
382
+ // Network (VNet) Operations
383
+ // ==========================================
384
+ /**
385
+ * List virtual networks, optionally filtered by resource group
386
+ */
387
+ async listVNets(subscriptionId, resourceGroup) {
388
+ try {
389
+ const subId = subscriptionId || this.subscriptionId;
390
+ if (!subId) {
391
+ return { success: false, error: 'No subscription ID provided' };
392
+ }
393
+ const { NetworkManagementClient } = await import('@azure/arm-network');
394
+ const credential = await this.getCredential();
395
+ const client = new NetworkManagementClient(credential, subId);
396
+ const vnets = [];
397
+ if (resourceGroup) {
398
+ for await (const vnet of client.virtualNetworks.list(resourceGroup)) {
399
+ vnets.push(this.mapVNet(vnet));
400
+ }
401
+ }
402
+ else {
403
+ for await (const vnet of client.virtualNetworks.listAll()) {
404
+ vnets.push(this.mapVNet(vnet));
405
+ }
406
+ }
407
+ logger.debug(`Listed ${vnets.length} virtual networks`, { resourceGroup });
408
+ return { success: true, data: { vnets, count: vnets.length } };
409
+ }
410
+ catch (error) {
411
+ logger.error('Failed to list virtual networks', error);
412
+ return { success: false, error: error.message || 'Failed to list virtual networks' };
413
+ }
414
+ }
415
+ /**
416
+ * List subnets for a virtual network
417
+ */
418
+ async listSubnets(subscriptionId, resourceGroup, vnetName) {
419
+ try {
420
+ const subId = subscriptionId || this.subscriptionId;
421
+ if (!subId) {
422
+ return { success: false, error: 'No subscription ID provided' };
423
+ }
424
+ const { NetworkManagementClient } = await import('@azure/arm-network');
425
+ const credential = await this.getCredential();
426
+ const client = new NetworkManagementClient(credential, subId);
427
+ const subnets = [];
428
+ for await (const subnet of client.subnets.list(resourceGroup, vnetName)) {
429
+ subnets.push({
430
+ id: subnet.id,
431
+ name: subnet.name,
432
+ type: subnet.type,
433
+ addressPrefix: subnet.addressPrefix,
434
+ addressPrefixes: subnet.addressPrefixes,
435
+ provisioningState: subnet.provisioningState,
436
+ privateEndpointNetworkPolicies: subnet.privateEndpointNetworkPolicies,
437
+ privateLinkServiceNetworkPolicies: subnet.privateLinkServiceNetworkPolicies,
438
+ networkSecurityGroup: subnet.networkSecurityGroup
439
+ ? { id: subnet.networkSecurityGroup.id }
440
+ : undefined,
441
+ routeTable: subnet.routeTable ? { id: subnet.routeTable.id } : undefined,
442
+ serviceEndpoints: subnet.serviceEndpoints?.map((se) => ({
443
+ service: se.service,
444
+ locations: se.locations,
445
+ provisioningState: se.provisioningState,
446
+ })),
447
+ delegations: subnet.delegations?.map((d) => ({
448
+ name: d.name,
449
+ serviceName: d.serviceName,
450
+ provisioningState: d.provisioningState,
451
+ })),
452
+ });
453
+ }
454
+ logger.debug(`Listed ${subnets.length} subnets for VNet ${vnetName}`);
455
+ return { success: true, data: { subnets, count: subnets.length } };
456
+ }
457
+ catch (error) {
458
+ logger.error('Failed to list subnets', { vnetName, error });
459
+ return { success: false, error: error.message || 'Failed to list subnets' };
460
+ }
461
+ }
462
+ /**
463
+ * Map a VNet to a normalized response format
464
+ */
465
+ mapVNet(vnet) {
466
+ return {
467
+ id: vnet.id,
468
+ name: vnet.name,
469
+ location: vnet.location,
470
+ type: vnet.type,
471
+ provisioningState: vnet.provisioningState,
472
+ addressSpace: vnet.addressSpace?.addressPrefixes,
473
+ dhcpOptions: vnet.dhcpOptions?.dnsServers,
474
+ enableDdosProtection: vnet.enableDdosProtection,
475
+ enableVmProtection: vnet.enableVmProtection,
476
+ subnets: vnet.subnets?.map((s) => ({
477
+ id: s.id,
478
+ name: s.name,
479
+ addressPrefix: s.addressPrefix,
480
+ provisioningState: s.provisioningState,
481
+ })),
482
+ virtualNetworkPeerings: vnet.virtualNetworkPeerings?.map((p) => ({
483
+ id: p.id,
484
+ name: p.name,
485
+ peeringState: p.peeringState,
486
+ remoteVirtualNetwork: p.remoteVirtualNetwork?.id,
487
+ })),
488
+ tags: vnet.tags || {},
489
+ };
490
+ }
491
+ }