@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,389 @@
1
+ /**
2
+ * GitHub OAuth Implementation
3
+ * Primary: Device Flow (works in SSH/headless)
4
+ * Fallback: Browser-based OAuth with local callback server
5
+ */
6
+ import { createServer, } from 'node:http';
7
+ /**
8
+ * GitHub OAuth App Client ID
9
+ * This is safe to commit - it's a public identifier for the OAuth app
10
+ * The OAuth app must be registered at github.com/settings/developers
11
+ *
12
+ * Note: Until the OAuth App is registered, the GitHub identity step
13
+ * will be deferred/skipped. LLM provider setup works independently.
14
+ */
15
+ const GITHUB_CLIENT_ID = 'Ov23liPzN7sAjwDsqUcx';
16
+ /**
17
+ * Callback server port for browser-based OAuth fallback
18
+ */
19
+ const CALLBACK_PORT = 19284;
20
+ /**
21
+ * GitHub Device Flow OAuth
22
+ * Works in SSH sessions and headless environments
23
+ */
24
+ export class GitHubDeviceFlow {
25
+ clientId;
26
+ deviceCode = null;
27
+ interval = 5;
28
+ expiresAt = 0;
29
+ constructor(clientId = GITHUB_CLIENT_ID) {
30
+ this.clientId = clientId;
31
+ }
32
+ /**
33
+ * Step 1: Request device code from GitHub
34
+ * Returns the user code that must be entered at github.com/login/device
35
+ */
36
+ async requestDeviceCode() {
37
+ const response = await fetch('https://github.com/login/device/code', {
38
+ method: 'POST',
39
+ headers: {
40
+ Accept: 'application/json',
41
+ 'Content-Type': 'application/x-www-form-urlencoded',
42
+ },
43
+ body: new URLSearchParams({
44
+ client_id: this.clientId,
45
+ scope: 'read:user user:email',
46
+ }),
47
+ });
48
+ if (!response.ok) {
49
+ const text = await response.text();
50
+ throw new Error(`Failed to request device code: ${response.status} ${text}`);
51
+ }
52
+ const data = (await response.json());
53
+ // Store for polling
54
+ this.deviceCode = data.device_code;
55
+ this.interval = data.interval || 5;
56
+ this.expiresAt = Date.now() + data.expires_in * 1000;
57
+ return data;
58
+ }
59
+ /**
60
+ * Step 2: Poll for access token
61
+ * Call this repeatedly until it returns a token or throws an error
62
+ */
63
+ async pollForToken() {
64
+ if (!this.deviceCode) {
65
+ throw new Error('Device code not requested. Call requestDeviceCode first.');
66
+ }
67
+ if (Date.now() > this.expiresAt) {
68
+ throw new Error('Device code expired. Please start the login process again.');
69
+ }
70
+ const response = await fetch('https://github.com/login/oauth/access_token', {
71
+ method: 'POST',
72
+ headers: {
73
+ Accept: 'application/json',
74
+ 'Content-Type': 'application/x-www-form-urlencoded',
75
+ },
76
+ body: new URLSearchParams({
77
+ client_id: this.clientId,
78
+ device_code: this.deviceCode,
79
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
80
+ }),
81
+ });
82
+ if (!response.ok) {
83
+ const text = await response.text();
84
+ throw new Error(`Failed to poll for token: ${response.status} ${text}`);
85
+ }
86
+ return (await response.json());
87
+ }
88
+ /**
89
+ * Get the polling interval in milliseconds
90
+ */
91
+ getPollingInterval() {
92
+ return this.interval * 1000;
93
+ }
94
+ /**
95
+ * Wait for authorization by polling
96
+ * Returns the access token when the user completes authorization
97
+ */
98
+ async waitForAuthorization(onPoll, abortSignal) {
99
+ for (;;) {
100
+ if (abortSignal?.aborted) {
101
+ throw new Error('Authorization cancelled');
102
+ }
103
+ const result = await this.pollForToken();
104
+ if (result.access_token) {
105
+ return result.access_token;
106
+ }
107
+ if (result.error === 'authorization_pending') {
108
+ // User hasn't authorized yet, keep polling
109
+ onPoll?.();
110
+ await this.sleep(this.getPollingInterval());
111
+ continue;
112
+ }
113
+ if (result.error === 'slow_down') {
114
+ // GitHub is asking us to slow down
115
+ this.interval += 5;
116
+ await this.sleep(this.getPollingInterval());
117
+ continue;
118
+ }
119
+ if (result.error === 'expired_token') {
120
+ throw new Error('Device code expired. Please start the login process again.');
121
+ }
122
+ if (result.error === 'access_denied') {
123
+ throw new Error('Authorization was denied by the user.');
124
+ }
125
+ // Unknown error
126
+ throw new Error(result.error_description || result.error || 'Unknown authorization error');
127
+ }
128
+ }
129
+ sleep(ms) {
130
+ return new Promise(resolve => setTimeout(resolve, ms));
131
+ }
132
+ }
133
+ /**
134
+ * Fetch GitHub user profile using access token
135
+ */
136
+ export async function fetchGitHubUser(accessToken) {
137
+ const response = await fetch('https://api.github.com/user', {
138
+ headers: {
139
+ Authorization: `Bearer ${accessToken}`,
140
+ Accept: 'application/vnd.github.v3+json',
141
+ 'User-Agent': 'Nimbus-CLI',
142
+ },
143
+ });
144
+ if (!response.ok) {
145
+ const text = await response.text();
146
+ throw new Error(`Failed to fetch user profile: ${response.status} ${text}`);
147
+ }
148
+ return (await response.json());
149
+ }
150
+ /**
151
+ * Fetch GitHub user's primary email
152
+ */
153
+ export async function fetchGitHubEmail(accessToken) {
154
+ const response = await fetch('https://api.github.com/user/emails', {
155
+ headers: {
156
+ Authorization: `Bearer ${accessToken}`,
157
+ Accept: 'application/vnd.github.v3+json',
158
+ 'User-Agent': 'Nimbus-CLI',
159
+ },
160
+ });
161
+ if (!response.ok) {
162
+ // Email access might be restricted, return null
163
+ return null;
164
+ }
165
+ const emails = (await response.json());
166
+ const primaryEmail = emails.find(e => e.primary && e.verified);
167
+ return primaryEmail?.email || emails[0]?.email || null;
168
+ }
169
+ /**
170
+ * Complete GitHub authentication flow
171
+ * Returns a GitHubIdentity object ready to store
172
+ */
173
+ export async function completeGitHubAuth(accessToken) {
174
+ const [user, email] = await Promise.all([
175
+ fetchGitHubUser(accessToken),
176
+ fetchGitHubEmail(accessToken),
177
+ ]);
178
+ return {
179
+ username: user.login,
180
+ name: user.name,
181
+ email: email || user.email,
182
+ avatarUrl: user.avatar_url,
183
+ accessToken,
184
+ authenticatedAt: new Date().toISOString(),
185
+ };
186
+ }
187
+ /**
188
+ * Browser-based OAuth callback server (fallback)
189
+ * Creates a temporary local server to receive the OAuth callback
190
+ */
191
+ export class BrowserOAuthServer {
192
+ server = null;
193
+ clientId;
194
+ codePromise = null;
195
+ codeResolve = null;
196
+ codeReject = null;
197
+ constructor(clientId = GITHUB_CLIENT_ID) {
198
+ this.clientId = clientId;
199
+ }
200
+ /**
201
+ * Start the callback server and return the authorization URL
202
+ */
203
+ async start() {
204
+ // Create promise for receiving the code
205
+ this.codePromise = new Promise((resolve, reject) => {
206
+ this.codeResolve = resolve;
207
+ this.codeReject = reject;
208
+ });
209
+ // Start the server
210
+ this.server = createServer((req, res) => {
211
+ const url = new URL(req.url || '/', `http://localhost:${CALLBACK_PORT}`);
212
+ const webReq = new Request(url, { method: req.method || 'GET' });
213
+ const webRes = this.handleRequest(webReq);
214
+ res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));
215
+ webRes.text().then(body => res.end(body));
216
+ });
217
+ this.server.listen(CALLBACK_PORT);
218
+ // Build authorization URL
219
+ const params = new URLSearchParams({
220
+ client_id: this.clientId,
221
+ redirect_uri: `http://localhost:${CALLBACK_PORT}/callback`,
222
+ scope: 'read:user user:email',
223
+ state: this.generateState(),
224
+ });
225
+ return `https://github.com/login/oauth/authorize?${params}`;
226
+ }
227
+ /**
228
+ * Wait for the authorization code
229
+ */
230
+ async waitForCode(timeout = 300000) {
231
+ if (!this.codePromise) {
232
+ throw new Error('Server not started. Call start() first.');
233
+ }
234
+ const timeoutPromise = new Promise((_, reject) => {
235
+ setTimeout(() => {
236
+ reject(new Error('Authorization timed out'));
237
+ }, timeout);
238
+ });
239
+ try {
240
+ return await Promise.race([this.codePromise, timeoutPromise]);
241
+ }
242
+ finally {
243
+ this.stop();
244
+ }
245
+ }
246
+ /**
247
+ * Stop the callback server
248
+ */
249
+ stop() {
250
+ if (this.server) {
251
+ this.server.close();
252
+ this.server = null;
253
+ }
254
+ }
255
+ handleRequest(request) {
256
+ const url = new URL(request.url);
257
+ if (url.pathname === '/callback') {
258
+ const code = url.searchParams.get('code');
259
+ const error = url.searchParams.get('error');
260
+ const errorDescription = url.searchParams.get('error_description');
261
+ if (error) {
262
+ this.codeReject?.(new Error(errorDescription || error));
263
+ return new Response(this.getErrorPage(errorDescription || error), {
264
+ headers: { 'Content-Type': 'text/html' },
265
+ });
266
+ }
267
+ if (code) {
268
+ this.codeResolve?.(code);
269
+ return new Response(this.getSuccessPage(), {
270
+ headers: { 'Content-Type': 'text/html' },
271
+ });
272
+ }
273
+ return new Response('Bad request', { status: 400 });
274
+ }
275
+ return new Response('Not found', { status: 404 });
276
+ }
277
+ generateState() {
278
+ const array = new Uint8Array(16);
279
+ crypto.getRandomValues(array);
280
+ return Array.from(array, b => b.toString(16).padStart(2, '0')).join('');
281
+ }
282
+ getSuccessPage() {
283
+ return `
284
+ <!DOCTYPE html>
285
+ <html>
286
+ <head>
287
+ <title>Nimbus CLI - Authorization Successful</title>
288
+ <style>
289
+ body {
290
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
291
+ display: flex;
292
+ justify-content: center;
293
+ align-items: center;
294
+ height: 100vh;
295
+ margin: 0;
296
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
297
+ color: white;
298
+ }
299
+ .container {
300
+ text-align: center;
301
+ padding: 40px;
302
+ background: rgba(255,255,255,0.1);
303
+ border-radius: 16px;
304
+ backdrop-filter: blur(10px);
305
+ }
306
+ h1 { margin-bottom: 10px; }
307
+ p { opacity: 0.9; }
308
+ </style>
309
+ </head>
310
+ <body>
311
+ <div class="container">
312
+ <h1>✓ Authorization Successful</h1>
313
+ <p>You can close this window and return to the terminal.</p>
314
+ </div>
315
+ </body>
316
+ </html>`;
317
+ }
318
+ getErrorPage(error) {
319
+ return `
320
+ <!DOCTYPE html>
321
+ <html>
322
+ <head>
323
+ <title>Nimbus CLI - Authorization Failed</title>
324
+ <style>
325
+ body {
326
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
327
+ display: flex;
328
+ justify-content: center;
329
+ align-items: center;
330
+ height: 100vh;
331
+ margin: 0;
332
+ background: linear-gradient(135deg, #f43f5e 0%, #e11d48 100%);
333
+ color: white;
334
+ }
335
+ .container {
336
+ text-align: center;
337
+ padding: 40px;
338
+ background: rgba(255,255,255,0.1);
339
+ border-radius: 16px;
340
+ backdrop-filter: blur(10px);
341
+ }
342
+ h1 { margin-bottom: 10px; }
343
+ p { opacity: 0.9; }
344
+ </style>
345
+ </head>
346
+ <body>
347
+ <div class="container">
348
+ <h1>✗ Authorization Failed</h1>
349
+ <p>${error}</p>
350
+ <p>Please close this window and try again.</p>
351
+ </div>
352
+ </body>
353
+ </html>`;
354
+ }
355
+ }
356
+ /**
357
+ * Exchange authorization code for access token (browser flow)
358
+ * Note: This requires a client secret which should not be in CLI code
359
+ * For true CLI-only auth, use the Device Flow instead
360
+ */
361
+ export async function exchangeCodeForToken(code, clientId = GITHUB_CLIENT_ID, clientSecret) {
362
+ if (!clientSecret) {
363
+ throw new Error('Browser-based OAuth requires a client secret. Use Device Flow for CLI-only auth.');
364
+ }
365
+ const response = await fetch('https://github.com/login/oauth/access_token', {
366
+ method: 'POST',
367
+ headers: {
368
+ Accept: 'application/json',
369
+ 'Content-Type': 'application/x-www-form-urlencoded',
370
+ },
371
+ body: new URLSearchParams({
372
+ client_id: clientId,
373
+ client_secret: clientSecret,
374
+ code,
375
+ }),
376
+ });
377
+ if (!response.ok) {
378
+ const text = await response.text();
379
+ throw new Error(`Failed to exchange code for token: ${response.status} ${text}`);
380
+ }
381
+ const data = (await response.json());
382
+ if (data.error) {
383
+ throw new Error(data.error_description || data.error);
384
+ }
385
+ if (!data.access_token) {
386
+ throw new Error('No access token in response');
387
+ }
388
+ return data.access_token;
389
+ }