@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,119 @@
1
+ /**
2
+ * LLM Client
3
+ *
4
+ * WebSocket client for streaming LLM responses from the LLM Service
5
+ */
6
+ import { WebSocketClient, WebSocketURLs } from '.';
7
+ /**
8
+ * LLM Client for streaming chat completions
9
+ */
10
+ export class LLMClient {
11
+ wsUrl;
12
+ constructor(wsUrl) {
13
+ this.wsUrl = wsUrl || WebSocketURLs.LLM;
14
+ }
15
+ /**
16
+ * Stream a chat completion
17
+ * @param messages - Array of chat messages
18
+ * @param options - Chat options (model, taskType)
19
+ * @returns AsyncGenerator yielding StreamingChunk objects
20
+ */
21
+ async *streamChat(messages, options = {}) {
22
+ const ws = new WebSocketClient(this.wsUrl, {
23
+ reconnect: false, // Don't reconnect for single requests
24
+ });
25
+ const messageQueue = [];
26
+ let done = false;
27
+ let error = null;
28
+ let resolveWaiting = null;
29
+ // Set up message handler
30
+ const removeMessageHandler = ws.onMessage((data) => {
31
+ messageQueue.push(data);
32
+ if (data.type === 'done' || data.type === 'error') {
33
+ done = true;
34
+ if (data.type === 'error') {
35
+ error = new Error(data.message || data.error || 'Unknown error');
36
+ }
37
+ }
38
+ // Wake up the generator if it's waiting
39
+ if (resolveWaiting) {
40
+ resolveWaiting();
41
+ resolveWaiting = null;
42
+ }
43
+ });
44
+ const removeErrorHandler = ws.onError(() => {
45
+ error = new Error('WebSocket connection failed');
46
+ done = true;
47
+ if (resolveWaiting) {
48
+ resolveWaiting();
49
+ resolveWaiting = null;
50
+ }
51
+ });
52
+ const removeCloseHandler = ws.onClose(() => {
53
+ done = true;
54
+ if (resolveWaiting) {
55
+ resolveWaiting();
56
+ resolveWaiting = null;
57
+ }
58
+ });
59
+ try {
60
+ // Connect to WebSocket
61
+ await ws.connect();
62
+ // Send the chat request
63
+ ws.send({
64
+ messages,
65
+ model: options.model,
66
+ taskType: options.taskType,
67
+ });
68
+ // Yield chunks as they arrive
69
+ while (!done || messageQueue.length > 0) {
70
+ if (messageQueue.length > 0) {
71
+ const chunk = messageQueue.shift();
72
+ yield chunk;
73
+ }
74
+ else if (!done) {
75
+ // Wait for more messages
76
+ await new Promise(resolve => {
77
+ resolveWaiting = resolve;
78
+ });
79
+ }
80
+ }
81
+ if (error) {
82
+ throw error;
83
+ }
84
+ }
85
+ finally {
86
+ // Clean up
87
+ removeMessageHandler();
88
+ removeErrorHandler();
89
+ removeCloseHandler();
90
+ ws.close();
91
+ }
92
+ }
93
+ /**
94
+ * Send a single chat message and get streaming response
95
+ * Convenience method that builds the messages array
96
+ */
97
+ async *chat(userMessage, history = [], options = {}) {
98
+ const messages = [...history, { role: 'user', content: userMessage }];
99
+ yield* this.streamChat(messages, options);
100
+ }
101
+ /**
102
+ * Check if LLM service is available
103
+ */
104
+ async isAvailable() {
105
+ try {
106
+ // Use HTTP health check endpoint
107
+ const httpUrl = this.wsUrl.replace('ws://', 'http://').replace('wss://', 'https://');
108
+ const response = await fetch(`${httpUrl}/health`, {
109
+ signal: AbortSignal.timeout(5000),
110
+ });
111
+ return response.ok;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ }
118
+ // Export singleton instance
119
+ export const llmClient = new LLMClient();
@@ -0,0 +1,104 @@
1
+ import { logger, ServiceUnavailableError, TimeoutError, getServiceAuthHeaders } from '../utils';
2
+ /**
3
+ * REST Client for inter-service communication
4
+ */
5
+ export class RestClient {
6
+ baseUrl;
7
+ timeout;
8
+ headers;
9
+ retries;
10
+ constructor(baseUrl, options = {}) {
11
+ this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
12
+ this.timeout = options.timeout || 30000;
13
+ this.headers = {
14
+ 'Content-Type': 'application/json',
15
+ ...getServiceAuthHeaders(),
16
+ ...options.headers,
17
+ };
18
+ this.retries = options.retries || 0;
19
+ }
20
+ async get(path) {
21
+ return this.request('GET', path);
22
+ }
23
+ async post(path, body) {
24
+ return this.request('POST', path, body);
25
+ }
26
+ async put(path, body) {
27
+ return this.request('PUT', path, body);
28
+ }
29
+ async delete(path) {
30
+ return this.request('DELETE', path);
31
+ }
32
+ async request(method, path, body, attempt = 0) {
33
+ const url = `${this.baseUrl}${path}`;
34
+ try {
35
+ logger.debug(`${method} ${url}`);
36
+ const controller = new AbortController();
37
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
38
+ const response = await fetch(url, {
39
+ method,
40
+ headers: this.headers,
41
+ body: body ? JSON.stringify(body) : undefined,
42
+ signal: controller.signal,
43
+ });
44
+ clearTimeout(timeoutId);
45
+ if (!response.ok) {
46
+ const error = await response.text();
47
+ return {
48
+ success: false,
49
+ error: {
50
+ code: `HTTP_${response.status}`,
51
+ message: error || response.statusText,
52
+ service: this.baseUrl,
53
+ timestamp: new Date().toISOString(),
54
+ },
55
+ };
56
+ }
57
+ const data = await response.json();
58
+ return {
59
+ success: true,
60
+ data: data,
61
+ };
62
+ }
63
+ catch (error) {
64
+ // Handle abort (timeout)
65
+ if (error.name === 'AbortError') {
66
+ if (attempt < this.retries) {
67
+ logger.warn(`Request timeout, retrying (${attempt + 1}/${this.retries})...`);
68
+ return this.request(method, path, body, attempt + 1);
69
+ }
70
+ throw new TimeoutError(`${method} ${path}`, this.baseUrl, this.timeout);
71
+ }
72
+ // Handle connection errors
73
+ if (error.code === 'ECONNREFUSED' || error.cause?.code === 'ECONNREFUSED') {
74
+ throw new ServiceUnavailableError(this.baseUrl, {
75
+ url,
76
+ error: error.message,
77
+ });
78
+ }
79
+ // Other errors
80
+ return {
81
+ success: false,
82
+ error: {
83
+ code: 'REQUEST_ERROR',
84
+ message: error.message || 'Unknown error',
85
+ service: this.baseUrl,
86
+ timestamp: new Date().toISOString(),
87
+ details: error,
88
+ },
89
+ };
90
+ }
91
+ }
92
+ /**
93
+ * Health check helper
94
+ */
95
+ async healthCheck() {
96
+ try {
97
+ const response = await this.get('/health');
98
+ return response.success;
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Service Discovery (stub)
3
+ *
4
+ * Previously held URLs for 18 microservices. Nimbus is now a standalone binary —
5
+ * all services run in-process. These constants are kept for legacy import
6
+ * compatibility only. No HTTP services listen on these ports.
7
+ */
8
+ function getEnvOrDefault(key, defaultVal) {
9
+ return process.env[key] ?? defaultVal;
10
+ }
11
+ export const ServiceURLs = {
12
+ CLI: getEnvOrDefault('CLI_SERVICE_URL', 'http://localhost:3000'),
13
+ CORE_ENGINE: getEnvOrDefault('CORE_ENGINE_SERVICE_URL', 'http://localhost:3001'),
14
+ LLM: getEnvOrDefault('LLM_SERVICE_URL', 'http://localhost:3002'),
15
+ GENERATOR: getEnvOrDefault('GENERATOR_SERVICE_URL', 'http://localhost:3003'),
16
+ GIT_TOOLS: getEnvOrDefault('GIT_TOOLS_SERVICE_URL', 'http://localhost:3004'),
17
+ FS_TOOLS: getEnvOrDefault('FS_TOOLS_SERVICE_URL', 'http://localhost:3005'),
18
+ TERRAFORM_TOOLS: getEnvOrDefault('TERRAFORM_TOOLS_SERVICE_URL', 'http://localhost:3006'),
19
+ K8S_TOOLS: getEnvOrDefault('K8S_TOOLS_SERVICE_URL', 'http://localhost:3007'),
20
+ HELM_TOOLS: getEnvOrDefault('HELM_TOOLS_SERVICE_URL', 'http://localhost:3008'),
21
+ AWS_TOOLS: getEnvOrDefault('AWS_TOOLS_SERVICE_URL', 'http://localhost:3009'),
22
+ GITHUB_TOOLS: getEnvOrDefault('GITHUB_TOOLS_SERVICE_URL', 'http://localhost:3010'),
23
+ STATE: getEnvOrDefault('STATE_SERVICE_URL', 'http://localhost:3011'),
24
+ AUTH: getEnvOrDefault('AUTH_SERVICE_URL', 'http://localhost:3012'),
25
+ TEAM: getEnvOrDefault('TEAM_SERVICE_URL', 'http://localhost:3013'),
26
+ BILLING: getEnvOrDefault('BILLING_SERVICE_URL', 'http://localhost:3014'),
27
+ AUDIT: getEnvOrDefault('AUDIT_SERVICE_URL', 'http://localhost:3015'),
28
+ GCP_TOOLS: getEnvOrDefault('GCP_TOOLS_URL', 'http://localhost:3016'),
29
+ AZURE_TOOLS: getEnvOrDefault('AZURE_TOOLS_URL', 'http://localhost:3017'),
30
+ };
31
+ export const WebSocketURLs = {
32
+ CORE_ENGINE: getEnvOrDefault('CORE_ENGINE_WS_URL', 'ws://localhost:3101'),
33
+ LLM: getEnvOrDefault('LLM_WS_URL', 'ws://localhost:3102'),
34
+ GENERATOR: getEnvOrDefault('GENERATOR_WS_URL', 'ws://localhost:3103'),
35
+ };
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Terraform Tools Client
3
+ *
4
+ * REST client for communicating with the Terraform Tools Service
5
+ */
6
+ import { RestClient, ServiceURLs } from '.';
7
+ /**
8
+ * Client for Terraform Tools Service
9
+ */
10
+ export class TerraformClient {
11
+ client;
12
+ constructor(baseUrl) {
13
+ this.client = new RestClient(baseUrl || ServiceURLs.TERRAFORM_TOOLS);
14
+ }
15
+ /**
16
+ * Initialize a Terraform working directory
17
+ */
18
+ async init(directory) {
19
+ const response = await this.client.post('/api/terraform/init', {
20
+ directory,
21
+ });
22
+ if (response.success && response.data) {
23
+ return response.data;
24
+ }
25
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
26
+ }
27
+ /**
28
+ * Generate a Terraform execution plan
29
+ */
30
+ async plan(directory, options) {
31
+ const response = await this.client.post('/api/terraform/plan', {
32
+ directory,
33
+ ...options,
34
+ });
35
+ if (response.success && response.data) {
36
+ return response.data;
37
+ }
38
+ return {
39
+ success: false,
40
+ output: '',
41
+ hasChanges: false,
42
+ error: response.error?.message || 'Unknown error',
43
+ };
44
+ }
45
+ /**
46
+ * Apply Terraform changes
47
+ */
48
+ async apply(directory, options) {
49
+ const response = await this.client.post('/api/terraform/apply', {
50
+ directory,
51
+ ...options,
52
+ });
53
+ if (response.success && response.data) {
54
+ return response.data;
55
+ }
56
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
57
+ }
58
+ /**
59
+ * Validate Terraform configuration
60
+ */
61
+ async validate(directory) {
62
+ const response = await this.client.post('/api/terraform/validate', {
63
+ directory,
64
+ });
65
+ if (response.success && response.data) {
66
+ return response.data;
67
+ }
68
+ return { valid: false, output: '', error: response.error?.message || 'Unknown error' };
69
+ }
70
+ /**
71
+ * Destroy Terraform-managed infrastructure
72
+ */
73
+ async destroy(directory, options) {
74
+ const response = await this.client.post('/api/terraform/destroy', {
75
+ directory,
76
+ ...options,
77
+ });
78
+ if (response.success && response.data) {
79
+ return response.data;
80
+ }
81
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
82
+ }
83
+ /**
84
+ * Show Terraform state
85
+ */
86
+ async show(directory) {
87
+ const response = await this.client.post('/api/terraform/show', { directory });
88
+ if (response.success && response.data) {
89
+ return response.data;
90
+ }
91
+ return { success: false, output: '' };
92
+ }
93
+ /**
94
+ * Format Terraform configuration files
95
+ */
96
+ async fmt(directory, options) {
97
+ const response = await this.client.post('/api/terraform/fmt', {
98
+ workingDir: directory,
99
+ ...options,
100
+ });
101
+ if (response.success && response.data) {
102
+ return response.data;
103
+ }
104
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
105
+ }
106
+ /**
107
+ * Manage Terraform workspaces
108
+ */
109
+ workspace = {
110
+ list: async (directory) => {
111
+ const params = new URLSearchParams();
112
+ params.set('workingDir', directory);
113
+ const response = await this.client.get(`/api/terraform/workspace/list?${params.toString()}`);
114
+ if (response.success && response.data) {
115
+ return response.data;
116
+ }
117
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
118
+ },
119
+ select: async (name, directory) => {
120
+ const response = await this.client.post('/api/terraform/workspace/select', { name, workingDir: directory });
121
+ if (response.success && response.data) {
122
+ return response.data;
123
+ }
124
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
125
+ },
126
+ new: async (name, directory) => {
127
+ const response = await this.client.post('/api/terraform/workspace/new', { name, workingDir: directory });
128
+ if (response.success && response.data) {
129
+ return response.data;
130
+ }
131
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
132
+ },
133
+ delete: async (name, directory) => {
134
+ const response = await this.client.post('/api/terraform/workspace/delete', { name, workingDir: directory });
135
+ if (response.success && response.data) {
136
+ return response.data;
137
+ }
138
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
139
+ },
140
+ };
141
+ /**
142
+ * Import existing infrastructure into Terraform state
143
+ */
144
+ async import(directory, address, id) {
145
+ const response = await this.client.post('/api/terraform/import', {
146
+ workingDir: directory,
147
+ address,
148
+ id,
149
+ });
150
+ if (response.success && response.data) {
151
+ return response.data;
152
+ }
153
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
154
+ }
155
+ /**
156
+ * Manage Terraform state
157
+ */
158
+ state = {
159
+ list: async (directory) => {
160
+ const params = new URLSearchParams();
161
+ params.set('workingDir', directory);
162
+ const response = await this.client.get(`/api/terraform/state/list?${params.toString()}`);
163
+ if (response.success && response.data) {
164
+ return response.data;
165
+ }
166
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
167
+ },
168
+ show: async (address, directory) => {
169
+ const params = new URLSearchParams();
170
+ params.set('address', address);
171
+ params.set('workingDir', directory);
172
+ const response = await this.client.get(`/api/terraform/state/show?${params.toString()}`);
173
+ if (response.success && response.data) {
174
+ return response.data;
175
+ }
176
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
177
+ },
178
+ mv: async (directory, source, destination) => {
179
+ const response = await this.client.post('/api/terraform/state/mv', {
180
+ directory,
181
+ source,
182
+ destination,
183
+ });
184
+ if (response.success && response.data) {
185
+ return response.data;
186
+ }
187
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
188
+ },
189
+ pull: async (directory) => {
190
+ const params = new URLSearchParams();
191
+ params.set('directory', directory);
192
+ const response = await this.client.get(`/api/terraform/state/pull?${params.toString()}`);
193
+ if (response.success && response.data) {
194
+ return response.data;
195
+ }
196
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
197
+ },
198
+ push: async (directory, options) => {
199
+ const response = await this.client.post('/api/terraform/state/push', {
200
+ directory,
201
+ ...options,
202
+ });
203
+ if (response.success && response.data) {
204
+ return response.data;
205
+ }
206
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
207
+ },
208
+ };
209
+ /**
210
+ * Taint a resource, marking it for recreation on next apply
211
+ */
212
+ async taint(directory, address) {
213
+ const response = await this.client.post('/api/terraform/taint', {
214
+ directory,
215
+ address,
216
+ });
217
+ if (response.success && response.data) {
218
+ return response.data;
219
+ }
220
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
221
+ }
222
+ /**
223
+ * Untaint a resource, removing the taint mark
224
+ */
225
+ async untaint(directory, address) {
226
+ const response = await this.client.post('/api/terraform/untaint', {
227
+ directory,
228
+ address,
229
+ });
230
+ if (response.success && response.data) {
231
+ return response.data;
232
+ }
233
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
234
+ }
235
+ /**
236
+ * Generate a resource dependency graph in DOT format
237
+ */
238
+ async graph(directory, options) {
239
+ const params = new URLSearchParams();
240
+ params.set('directory', directory);
241
+ if (options?.type) {
242
+ params.set('type', options.type);
243
+ }
244
+ const response = await this.client.get(`/api/terraform/graph?${params.toString()}`);
245
+ if (response.success && response.data) {
246
+ return response.data;
247
+ }
248
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
249
+ }
250
+ /**
251
+ * Force unlock a locked state
252
+ */
253
+ async forceUnlock(directory, lockId) {
254
+ const response = await this.client.post('/api/terraform/force-unlock', { directory, lockId });
255
+ if (response.success && response.data) {
256
+ return response.data;
257
+ }
258
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
259
+ }
260
+ /**
261
+ * Refresh Terraform state against real infrastructure
262
+ */
263
+ async refresh(directory, options) {
264
+ const response = await this.client.post('/api/terraform/refresh', {
265
+ directory,
266
+ ...options,
267
+ });
268
+ if (response.success && response.data) {
269
+ return response.data;
270
+ }
271
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
272
+ }
273
+ /**
274
+ * Show Terraform output values
275
+ */
276
+ async output(directory, name) {
277
+ const params = new URLSearchParams();
278
+ params.set('workingDir', directory);
279
+ if (name) {
280
+ params.set('name', name);
281
+ }
282
+ const query = params.toString() ? `?${params.toString()}` : '';
283
+ const response = await this.client.get(`/api/terraform/output${query}`);
284
+ if (response.success && response.data) {
285
+ return response.data;
286
+ }
287
+ return { success: false, output: '', error: response.error?.message || 'Unknown error' };
288
+ }
289
+ /**
290
+ * Check if service is available
291
+ */
292
+ async isAvailable() {
293
+ try {
294
+ const response = await this.client.get('/health');
295
+ return response.success && response.data?.status === 'healthy';
296
+ }
297
+ catch {
298
+ return false;
299
+ }
300
+ }
301
+ }
302
+ export const terraformClient = new TerraformClient();