@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,415 @@
1
+ /**
2
+ * Provider Registry & Validation
3
+ * Static metadata and validation functions for LLM providers
4
+ */
5
+ /**
6
+ * Registry of all supported LLM providers
7
+ */
8
+ export const PROVIDER_REGISTRY = {
9
+ anthropic: {
10
+ name: 'anthropic',
11
+ displayName: 'Anthropic (Claude)',
12
+ description: 'Claude Sonnet 4, Opus 4, Haiku 4',
13
+ envVarName: 'ANTHROPIC_API_KEY',
14
+ apiKeyUrl: 'https://console.anthropic.com/settings/keys',
15
+ requiresApiKey: true,
16
+ models: [
17
+ { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4', isDefault: true },
18
+ { id: 'claude-opus-4-20250514', name: 'Claude Opus 4' },
19
+ { id: 'claude-haiku-4-20250514', name: 'Claude Haiku 4' },
20
+ ],
21
+ },
22
+ openai: {
23
+ name: 'openai',
24
+ displayName: 'OpenAI (GPT)',
25
+ description: 'GPT-4o, GPT-4o-mini',
26
+ envVarName: 'OPENAI_API_KEY',
27
+ apiKeyUrl: 'https://platform.openai.com/api-keys',
28
+ requiresApiKey: true,
29
+ models: [
30
+ { id: 'gpt-4o', name: 'GPT-4o', isDefault: true },
31
+ { id: 'gpt-4o-mini', name: 'GPT-4o Mini' },
32
+ { id: 'gpt-4-turbo', name: 'GPT-4 Turbo' },
33
+ ],
34
+ },
35
+ google: {
36
+ name: 'google',
37
+ displayName: 'Google (Gemini)',
38
+ description: 'Gemini 2.0 Flash, Gemini 1.5 Pro',
39
+ envVarName: 'GOOGLE_API_KEY',
40
+ apiKeyUrl: 'https://aistudio.google.com/app/apikey',
41
+ requiresApiKey: true,
42
+ models: [
43
+ { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', isDefault: true },
44
+ { id: 'gemini-1.5-pro', name: 'Gemini 1.5 Pro' },
45
+ { id: 'gemini-1.5-flash', name: 'Gemini 1.5 Flash' },
46
+ ],
47
+ },
48
+ openrouter: {
49
+ name: 'openrouter',
50
+ displayName: 'OpenRouter',
51
+ description: 'Access multiple models via OpenRouter',
52
+ envVarName: 'OPENROUTER_API_KEY',
53
+ apiKeyUrl: 'https://openrouter.ai/keys',
54
+ requiresApiKey: true,
55
+ models: [
56
+ {
57
+ id: 'anthropic/claude-sonnet-4',
58
+ name: 'Claude Sonnet 4 (via OpenRouter)',
59
+ isDefault: true,
60
+ },
61
+ { id: 'openai/gpt-4o', name: 'GPT-4o (via OpenRouter)' },
62
+ { id: 'google/gemini-pro', name: 'Gemini Pro (via OpenRouter)' },
63
+ { id: 'meta-llama/llama-3.1-405b-instruct', name: 'Llama 3.1 405B' },
64
+ ],
65
+ },
66
+ ollama: {
67
+ name: 'ollama',
68
+ displayName: 'Ollama (Local)',
69
+ description: 'Local models: Llama 3.2, CodeLlama, Mistral',
70
+ requiresApiKey: false,
71
+ supportsBaseUrl: true,
72
+ defaultBaseUrl: 'http://localhost:11434',
73
+ models: [
74
+ { id: 'llama3.2', name: 'Llama 3.2', isDefault: true },
75
+ { id: 'codellama', name: 'CodeLlama' },
76
+ { id: 'mistral', name: 'Mistral' },
77
+ { id: 'deepseek-coder', name: 'DeepSeek Coder' },
78
+ ],
79
+ },
80
+ groq: {
81
+ name: 'groq',
82
+ displayName: 'Groq',
83
+ description: 'Ultra-fast inference: Llama 3, Mixtral',
84
+ envVarName: 'GROQ_API_KEY',
85
+ apiKeyUrl: 'https://console.groq.com/keys',
86
+ requiresApiKey: true,
87
+ models: [
88
+ { id: 'llama-3.3-70b-versatile', name: 'Llama 3.3 70B', isDefault: true },
89
+ { id: 'llama-3.1-8b-instant', name: 'Llama 3.1 8B Instant' },
90
+ { id: 'mixtral-8x7b-32768', name: 'Mixtral 8x7B' },
91
+ ],
92
+ },
93
+ together: {
94
+ name: 'together',
95
+ displayName: 'Together AI',
96
+ description: 'Open-source models: Llama, CodeLlama, Mistral',
97
+ envVarName: 'TOGETHER_API_KEY',
98
+ apiKeyUrl: 'https://api.together.xyz/settings/api-keys',
99
+ requiresApiKey: true,
100
+ models: [
101
+ {
102
+ id: 'meta-llama/Llama-3.3-70B-Instruct-Turbo',
103
+ name: 'Llama 3.3 70B Turbo',
104
+ isDefault: true,
105
+ },
106
+ { id: 'meta-llama/Llama-3.1-8B-Instruct-Turbo', name: 'Llama 3.1 8B Turbo' },
107
+ { id: 'mistralai/Mixtral-8x7B-Instruct-v0.1', name: 'Mixtral 8x7B' },
108
+ ],
109
+ },
110
+ deepseek: {
111
+ name: 'deepseek',
112
+ displayName: 'DeepSeek',
113
+ description: 'DeepSeek V3, DeepSeek Coder',
114
+ envVarName: 'DEEPSEEK_API_KEY',
115
+ apiKeyUrl: 'https://platform.deepseek.com/api_keys',
116
+ requiresApiKey: true,
117
+ models: [
118
+ { id: 'deepseek-chat', name: 'DeepSeek V3', isDefault: true },
119
+ { id: 'deepseek-coder', name: 'DeepSeek Coder' },
120
+ ],
121
+ },
122
+ fireworks: {
123
+ name: 'fireworks',
124
+ displayName: 'Fireworks AI',
125
+ description: 'Fast inference: Llama, Mixtral, FireFunction',
126
+ envVarName: 'FIREWORKS_API_KEY',
127
+ apiKeyUrl: 'https://fireworks.ai/api-keys',
128
+ requiresApiKey: true,
129
+ models: [
130
+ {
131
+ id: 'accounts/fireworks/models/llama-v3p3-70b-instruct',
132
+ name: 'Llama 3.3 70B',
133
+ isDefault: true,
134
+ },
135
+ { id: 'accounts/fireworks/models/mixtral-8x7b-instruct', name: 'Mixtral 8x7B' },
136
+ ],
137
+ },
138
+ perplexity: {
139
+ name: 'perplexity',
140
+ displayName: 'Perplexity',
141
+ description: 'Search-augmented AI: Sonar models',
142
+ envVarName: 'PERPLEXITY_API_KEY',
143
+ apiKeyUrl: 'https://www.perplexity.ai/settings/api',
144
+ requiresApiKey: true,
145
+ models: [
146
+ { id: 'sonar-pro', name: 'Sonar Pro', isDefault: true },
147
+ { id: 'sonar', name: 'Sonar' },
148
+ ],
149
+ },
150
+ bedrock: {
151
+ name: 'bedrock',
152
+ displayName: 'AWS Bedrock',
153
+ description: 'Claude via AWS Bedrock (uses IAM credentials)',
154
+ envVarName: 'AWS_ACCESS_KEY_ID',
155
+ requiresApiKey: false,
156
+ supportsBaseUrl: true,
157
+ defaultBaseUrl: 'us-east-1',
158
+ models: [
159
+ {
160
+ id: 'anthropic.claude-sonnet-4-20250514-v1:0',
161
+ name: 'Claude Sonnet 4 (Bedrock)',
162
+ isDefault: true,
163
+ },
164
+ { id: 'anthropic.claude-haiku-4-20250514-v1:0', name: 'Claude Haiku 4 (Bedrock)' },
165
+ ],
166
+ },
167
+ };
168
+ /**
169
+ * Get provider info from registry
170
+ */
171
+ export function getProviderInfo(name) {
172
+ return PROVIDER_REGISTRY[name];
173
+ }
174
+ /**
175
+ * Get all provider names
176
+ */
177
+ export function getProviderNames() {
178
+ return Object.keys(PROVIDER_REGISTRY);
179
+ }
180
+ /**
181
+ * Get the default model for a provider
182
+ */
183
+ export function getDefaultModel(name) {
184
+ const info = PROVIDER_REGISTRY[name];
185
+ const defaultModel = info.models.find(m => m.isDefault);
186
+ return defaultModel?.id || info.models[0].id;
187
+ }
188
+ /**
189
+ * Validate a provider's API key or configuration
190
+ * Makes lightweight test API calls to verify credentials
191
+ */
192
+ export async function validateProviderApiKey(provider, apiKey, baseUrl) {
193
+ try {
194
+ switch (provider) {
195
+ case 'anthropic':
196
+ return await validateAnthropic(apiKey);
197
+ case 'openai':
198
+ return await validateOpenAI(apiKey);
199
+ case 'google':
200
+ return await validateGoogle(apiKey);
201
+ case 'openrouter':
202
+ return await validateOpenRouter(apiKey);
203
+ case 'ollama':
204
+ return await validateOllama(baseUrl);
205
+ case 'groq':
206
+ return await validateOpenAICompatible(apiKey, 'https://api.groq.com/openai/v1/models');
207
+ case 'together':
208
+ return await validateOpenAICompatible(apiKey, 'https://api.together.xyz/v1/models');
209
+ case 'deepseek':
210
+ return await validateOpenAICompatible(apiKey, 'https://api.deepseek.com/v1/models');
211
+ case 'fireworks':
212
+ return await validateOpenAICompatible(apiKey, 'https://api.fireworks.ai/inference/v1/models');
213
+ case 'perplexity':
214
+ return await validateOpenAICompatible(apiKey, 'https://api.perplexity.ai/models');
215
+ case 'bedrock':
216
+ return await validateBedrock(baseUrl);
217
+ default:
218
+ return { valid: false, error: `Unknown provider: ${provider}` };
219
+ }
220
+ }
221
+ catch (error) {
222
+ const message = error instanceof Error ? error.message : 'Unknown error';
223
+ return { valid: false, error: message };
224
+ }
225
+ }
226
+ /**
227
+ * Validate Anthropic API key
228
+ * Uses POST /v1/messages with max_tokens: 1
229
+ */
230
+ async function validateAnthropic(apiKey) {
231
+ if (!apiKey) {
232
+ return { valid: false, error: 'API key is required' };
233
+ }
234
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
235
+ method: 'POST',
236
+ headers: {
237
+ 'Content-Type': 'application/json',
238
+ 'x-api-key': apiKey,
239
+ 'anthropic-version': '2023-06-01',
240
+ },
241
+ body: JSON.stringify({
242
+ model: 'claude-haiku-4-20250514',
243
+ max_tokens: 1,
244
+ messages: [{ role: 'user', content: 'Hi' }],
245
+ }),
246
+ });
247
+ if (response.ok) {
248
+ return { valid: true };
249
+ }
250
+ // Check for specific error types
251
+ if (response.status === 401) {
252
+ return { valid: false, error: 'Invalid API key' };
253
+ }
254
+ if (response.status === 400) {
255
+ // 400 errors with valid auth often mean the key is valid but request is malformed
256
+ // For validation purposes, a 400 with auth working is acceptable
257
+ const body = (await response.json().catch(() => ({})));
258
+ if (body.error?.type === 'invalid_request_error') {
259
+ // Key is valid, just request was bad
260
+ return { valid: true };
261
+ }
262
+ }
263
+ const errorText = await response.text().catch(() => 'Unknown error');
264
+ return { valid: false, error: `API error: ${response.status} - ${errorText}` };
265
+ }
266
+ /**
267
+ * Validate OpenAI API key
268
+ * Uses GET /v1/models
269
+ */
270
+ async function validateOpenAI(apiKey) {
271
+ if (!apiKey) {
272
+ return { valid: false, error: 'API key is required' };
273
+ }
274
+ const response = await fetch('https://api.openai.com/v1/models', {
275
+ method: 'GET',
276
+ headers: {
277
+ Authorization: `Bearer ${apiKey}`,
278
+ },
279
+ });
280
+ if (response.ok) {
281
+ const data = (await response.json());
282
+ const models = data.data?.map(m => m.id) || [];
283
+ return { valid: true, models };
284
+ }
285
+ if (response.status === 401) {
286
+ return { valid: false, error: 'Invalid API key' };
287
+ }
288
+ const errorText = await response.text().catch(() => 'Unknown error');
289
+ return { valid: false, error: `API error: ${response.status} - ${errorText}` };
290
+ }
291
+ /**
292
+ * Validate Google API key
293
+ * Uses GET /v1/models?key=<key>
294
+ */
295
+ async function validateGoogle(apiKey) {
296
+ if (!apiKey) {
297
+ return { valid: false, error: 'API key is required' };
298
+ }
299
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1/models?key=${encodeURIComponent(apiKey)}`, {
300
+ method: 'GET',
301
+ });
302
+ if (response.ok) {
303
+ const data = (await response.json());
304
+ const models = data.models?.map(m => m.name) || [];
305
+ return { valid: true, models };
306
+ }
307
+ if (response.status === 400 || response.status === 403) {
308
+ return { valid: false, error: 'Invalid API key' };
309
+ }
310
+ const errorText = await response.text().catch(() => 'Unknown error');
311
+ return { valid: false, error: `API error: ${response.status} - ${errorText}` };
312
+ }
313
+ /**
314
+ * Validate OpenRouter API key
315
+ * Uses GET /api/v1/models with Bearer auth
316
+ */
317
+ async function validateOpenRouter(apiKey) {
318
+ if (!apiKey) {
319
+ return { valid: false, error: 'API key is required' };
320
+ }
321
+ const response = await fetch('https://openrouter.ai/api/v1/models', {
322
+ method: 'GET',
323
+ headers: {
324
+ Authorization: `Bearer ${apiKey}`,
325
+ },
326
+ });
327
+ if (response.ok) {
328
+ const data = (await response.json());
329
+ const models = data.data?.map(m => m.id) || [];
330
+ return { valid: true, models };
331
+ }
332
+ if (response.status === 401) {
333
+ return { valid: false, error: 'Invalid API key' };
334
+ }
335
+ const errorText = await response.text().catch(() => 'Unknown error');
336
+ return { valid: false, error: `API error: ${response.status} - ${errorText}` };
337
+ }
338
+ /**
339
+ * Validate OpenAI-compatible provider API key
340
+ * Uses GET /v1/models (or equivalent) with Bearer auth
341
+ */
342
+ async function validateOpenAICompatible(apiKey, modelsUrl) {
343
+ if (!apiKey) {
344
+ return { valid: false, error: 'API key is required' };
345
+ }
346
+ const url = modelsUrl || 'https://api.openai.com/v1/models';
347
+ const response = await fetch(url, {
348
+ method: 'GET',
349
+ headers: {
350
+ Authorization: `Bearer ${apiKey}`,
351
+ },
352
+ });
353
+ if (response.ok) {
354
+ return { valid: true };
355
+ }
356
+ if (response.status === 401 || response.status === 403) {
357
+ return { valid: false, error: 'Invalid API key' };
358
+ }
359
+ const errorText = await response.text().catch(() => 'Unknown error');
360
+ return { valid: false, error: `API error: ${response.status} - ${errorText}` };
361
+ }
362
+ /**
363
+ * Validate Ollama connection
364
+ * Uses GET <baseUrl>/api/tags (no key needed)
365
+ */
366
+ async function validateOllama(baseUrl) {
367
+ const url = baseUrl || 'http://localhost:11434';
368
+ try {
369
+ const response = await fetch(`${url}/api/tags`, {
370
+ method: 'GET',
371
+ });
372
+ if (response.ok) {
373
+ const data = (await response.json());
374
+ const models = data.models?.map(m => m.name) || [];
375
+ return { valid: true, models };
376
+ }
377
+ const errorText = await response.text().catch(() => 'Unknown error');
378
+ return { valid: false, error: `Ollama API error: ${response.status} - ${errorText}` };
379
+ }
380
+ catch (error) {
381
+ if (error instanceof TypeError && error.message.includes('fetch')) {
382
+ return {
383
+ valid: false,
384
+ error: `Cannot connect to Ollama at ${url}. Is Ollama running?`,
385
+ };
386
+ }
387
+ throw error;
388
+ }
389
+ }
390
+ /**
391
+ * Validate AWS Bedrock credentials
392
+ * Checks for AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY env vars,
393
+ * or AWS credentials file (~/.aws/credentials).
394
+ */
395
+ async function validateBedrock(_region) {
396
+ const hasAccessKey = !!process.env.AWS_ACCESS_KEY_ID;
397
+ const hasSecretKey = !!process.env.AWS_SECRET_ACCESS_KEY;
398
+ const hasProfile = !!process.env.AWS_PROFILE;
399
+ // Check for AWS credentials file
400
+ const fs = await import('fs');
401
+ const path = await import('path');
402
+ const os = await import('os');
403
+ const credentialsPath = path.join(os.homedir(), '.aws', 'credentials');
404
+ const hasCredentialsFile = fs.existsSync(credentialsPath);
405
+ if (hasAccessKey && hasSecretKey) {
406
+ return { valid: true };
407
+ }
408
+ if (hasProfile || hasCredentialsFile) {
409
+ return { valid: true };
410
+ }
411
+ return {
412
+ valid: false,
413
+ error: 'AWS credentials not found. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, or configure ~/.aws/credentials.',
414
+ };
415
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * SSO Device Flow
3
+ * Enterprise SSO authentication using device code flow
4
+ */
5
+ import { authClient } from '../clients/enterprise-client';
6
+ /**
7
+ * SSO Device Flow for enterprise authentication
8
+ * Uses the auth-service for device code management
9
+ */
10
+ export class SSODeviceFlow {
11
+ deviceCode = null;
12
+ interval = 5;
13
+ expiresAt = 0;
14
+ /**
15
+ * Initiate device code flow
16
+ * Returns device code and user code for the client
17
+ */
18
+ async initiate() {
19
+ const response = await authClient.initiateDeviceFlow();
20
+ this.deviceCode = response.deviceCode;
21
+ this.interval = response.interval || 5;
22
+ this.expiresAt = Date.now() + response.expiresIn * 1000;
23
+ return response;
24
+ }
25
+ /**
26
+ * Poll for authorization
27
+ * Returns access token when user authorizes, null if pending
28
+ */
29
+ async poll() {
30
+ if (!this.deviceCode) {
31
+ throw new Error('Device code not initiated. Call initiate() first.');
32
+ }
33
+ if (Date.now() > this.expiresAt) {
34
+ throw new Error('Device code expired. Please start the login process again.');
35
+ }
36
+ const response = await authClient.pollDeviceCode(this.deviceCode);
37
+ if (response.accessToken) {
38
+ return response.accessToken;
39
+ }
40
+ if (response.error === 'authorization_pending') {
41
+ return null;
42
+ }
43
+ if (response.error === 'slow_down') {
44
+ this.interval += 5;
45
+ return null;
46
+ }
47
+ if (response.error === 'expired_token') {
48
+ throw new Error('Device code expired. Please start the login process again.');
49
+ }
50
+ if (response.error === 'access_denied') {
51
+ throw new Error('Authorization was denied.');
52
+ }
53
+ throw new Error(response.errorDescription || response.error || 'Unknown error');
54
+ }
55
+ /**
56
+ * Get polling interval in milliseconds
57
+ */
58
+ getPollingInterval() {
59
+ return this.interval * 1000;
60
+ }
61
+ /**
62
+ * Wait for authorization by polling
63
+ * Returns access token when user completes authorization
64
+ */
65
+ async waitForAuthorization(onPoll, abortSignal) {
66
+ for (;;) {
67
+ if (abortSignal?.aborted) {
68
+ throw new Error('Authorization cancelled');
69
+ }
70
+ const token = await this.poll();
71
+ if (token) {
72
+ return token;
73
+ }
74
+ onPoll?.();
75
+ await this.sleep(this.getPollingInterval());
76
+ }
77
+ }
78
+ sleep(ms) {
79
+ return new Promise(resolve => setTimeout(resolve, ms));
80
+ }
81
+ }
82
+ /**
83
+ * Validate an SSO access token
84
+ */
85
+ export async function validateSSOToken(accessToken) {
86
+ return authClient.validateToken(accessToken);
87
+ }