@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,409 @@
1
+ /**
2
+ * Nimbus Agentic Tool-Use Type System
3
+ *
4
+ * Core type definitions for the agentic tool-use system. Every tool that
5
+ * Nimbus can invoke -- whether a built-in operation, a DevOps command, or
6
+ * an MCP server tool -- is described by a {@link ToolDefinition} and
7
+ * registered in the {@link ToolRegistry}.
8
+ *
9
+ * The permission model follows a four-tier escalation ladder
10
+ * ({@link PermissionTier}) that controls whether a tool invocation requires
11
+ * user confirmation, and the three-category taxonomy ({@link ToolCategory})
12
+ * allows consumers to filter tools by surface area.
13
+ *
14
+ * Provider-specific serialization helpers ({@link AnthropicTool},
15
+ * {@link OpenAITool}, {@link GoogleTool}) let the engine convert a single
16
+ * {@link ToolDefinition} into whatever shape each LLM API expects.
17
+ *
18
+ * @module tools/schemas/types
19
+ */
20
+ /**
21
+ * Ordered list of all permission tiers from least restrictive to most
22
+ * restrictive. Useful for comparison and escalation logic.
23
+ */
24
+ export const PERMISSION_TIER_ORDER = [
25
+ 'auto_allow',
26
+ 'ask_once',
27
+ 'always_ask',
28
+ 'blocked',
29
+ ];
30
+ /**
31
+ * Return the numeric severity index of a {@link PermissionTier}.
32
+ * Lower values are less restrictive.
33
+ *
34
+ * @param tier - The permission tier to evaluate.
35
+ * @returns An integer from 0 (`auto_allow`) to 3 (`blocked`).
36
+ */
37
+ export function permissionTierIndex(tier) {
38
+ return PERMISSION_TIER_ORDER.indexOf(tier);
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // JSON Schema Conversion Utility
42
+ // ---------------------------------------------------------------------------
43
+ /**
44
+ * Convert a Zod schema into a plain JSON Schema object suitable for
45
+ * provider APIs.
46
+ *
47
+ * This is a lightweight converter that handles the most common Zod types
48
+ * used in tool definitions (objects, strings, numbers, booleans, arrays,
49
+ * enums, optionals, and defaults). For deeply nested or exotic schemas
50
+ * consider using a full-featured library like `zod-to-json-schema`.
51
+ *
52
+ * @param schema - Any Zod schema.
53
+ * @returns A JSON Schema object.
54
+ */
55
+ export function zodToJsonSchema(schema) {
56
+ return convertZodNode(schema);
57
+ }
58
+ /**
59
+ * Internal recursive walker that translates individual Zod nodes into
60
+ * their JSON Schema equivalents.
61
+ *
62
+ * Because this function must work with Zod v3 _and_ v4 (whose generic
63
+ * constraints differ significantly), the runtime casts use `any` to
64
+ * bypass version-specific type parameter requirements. This is safe
65
+ * because every branch is guarded by a runtime type-tag check first.
66
+ */
67
+ function convertZodNode(schema) {
68
+ // Cast once to `any` for internal introspection. Every access below is
69
+ // guarded by a runtime type-tag check, so this is safe.
70
+ const s = schema;
71
+ // Unwrap ZodOptional / ZodNullable / ZodDefault to reach the inner type.
72
+ if (isZodOptional(schema)) {
73
+ return convertZodNode(s.unwrap());
74
+ }
75
+ if (isZodDefault(schema)) {
76
+ const inner = convertZodNode(s.removeDefault());
77
+ // Zod v3: _def.defaultValue is a function. Zod v4: it is a plain value.
78
+ const raw = s._def?.defaultValue ?? s._zod?.def?.defaultValue;
79
+ const defaultValue = typeof raw === 'function' ? raw() : raw;
80
+ return { ...inner, default: defaultValue };
81
+ }
82
+ if (isZodNullable(schema)) {
83
+ const inner = convertZodNode(s.unwrap());
84
+ return { ...inner, nullable: true };
85
+ }
86
+ // ZodObject
87
+ if (isZodObject(schema)) {
88
+ const shape = s.shape;
89
+ const properties = {};
90
+ const required = [];
91
+ for (const [key, value] of Object.entries(shape)) {
92
+ const fieldSchema = value;
93
+ properties[key] = convertZodNode(fieldSchema);
94
+ // Attach description from .describe() if present.
95
+ // Zod v3: _def.description. Zod v4: _zod.def.description.
96
+ const fieldAny = fieldSchema;
97
+ const desc = fieldAny._def?.description ?? fieldAny._zod?.def?.description;
98
+ if (desc) {
99
+ properties[key].description = desc;
100
+ }
101
+ // A field is required unless it is optional/default-wrapped.
102
+ if (!isZodOptional(fieldSchema) && !isZodDefault(fieldSchema)) {
103
+ required.push(key);
104
+ }
105
+ }
106
+ const result = { type: 'object', properties };
107
+ if (required.length > 0) {
108
+ result.required = required;
109
+ }
110
+ const objDesc = s._def?.description ?? s._zod?.def?.description;
111
+ if (objDesc) {
112
+ result.description = objDesc;
113
+ }
114
+ return result;
115
+ }
116
+ // ZodString
117
+ if (isZodString(schema)) {
118
+ return { type: 'string' };
119
+ }
120
+ // ZodNumber
121
+ if (isZodNumber(schema)) {
122
+ return { type: 'number' };
123
+ }
124
+ // ZodBoolean
125
+ if (isZodBoolean(schema)) {
126
+ return { type: 'boolean' };
127
+ }
128
+ // ZodEnum
129
+ if (isZodEnum(schema)) {
130
+ // `.options` is available in both Zod v3 and v4.
131
+ const values = s.options;
132
+ return { type: 'string', enum: values };
133
+ }
134
+ // ZodArray
135
+ if (isZodArray(schema)) {
136
+ const itemSchema = s.element;
137
+ return { type: 'array', items: convertZodNode(itemSchema) };
138
+ }
139
+ // ZodLiteral
140
+ if (isZodLiteral(schema)) {
141
+ const value = s.value;
142
+ return { type: typeof value, const: value };
143
+ }
144
+ // ZodUnion (simple enum-like unions of literals)
145
+ if (isZodUnion(schema)) {
146
+ const options = s.options;
147
+ return { type: 'object', anyOf: options.map(o => convertZodNode(o)) };
148
+ }
149
+ // ZodRecord
150
+ if (isZodRecord(schema)) {
151
+ // Zod v3: `.valueSchema`. Zod v4: `._zod.def.valueType`.
152
+ const valueSchema = s.valueSchema ?? s._zod?.def?.valueType;
153
+ if (valueSchema) {
154
+ return { type: 'object', additionalProperties: convertZodNode(valueSchema) };
155
+ }
156
+ return { type: 'object' };
157
+ }
158
+ // Fallback -- treat as opaque object
159
+ return { type: 'object' };
160
+ }
161
+ // ---------------------------------------------------------------------------
162
+ // Zod type-tag guards (work across Zod v3 and v4)
163
+ // ---------------------------------------------------------------------------
164
+ /**
165
+ * Extract the internal type discriminator from a Zod schema.
166
+ *
167
+ * - Zod v3 stores it at `_def.typeName` (e.g. `'ZodString'`).
168
+ * - Zod v4 stores it at `_zod.def.type` (e.g. `'string'`).
169
+ *
170
+ * We normalize both to the v3-style `'ZodXxx'` name so the guards below
171
+ * can use a single comparison.
172
+ */
173
+ function zodTypeName(schema) {
174
+ const s = schema;
175
+ // Zod v3 path
176
+ const v3Name = s._def?.typeName;
177
+ if (v3Name) {
178
+ return v3Name;
179
+ }
180
+ // Zod v4 path: `_zod.def.type` is a lowercase short name like 'string'.
181
+ const v4Type = s._zod?.def?.type;
182
+ if (v4Type) {
183
+ // Capitalize to match Zod v3 convention: 'string' -> 'ZodString'.
184
+ return `Zod${v4Type.charAt(0).toUpperCase()}${v4Type.slice(1)}`;
185
+ }
186
+ return '';
187
+ }
188
+ function isZodObject(s) {
189
+ return zodTypeName(s) === 'ZodObject';
190
+ }
191
+ function isZodString(s) {
192
+ return zodTypeName(s) === 'ZodString';
193
+ }
194
+ function isZodNumber(s) {
195
+ return zodTypeName(s) === 'ZodNumber';
196
+ }
197
+ function isZodBoolean(s) {
198
+ return zodTypeName(s) === 'ZodBoolean';
199
+ }
200
+ function isZodEnum(s) {
201
+ return zodTypeName(s) === 'ZodEnum';
202
+ }
203
+ function isZodArray(s) {
204
+ return zodTypeName(s) === 'ZodArray';
205
+ }
206
+ function isZodOptional(s) {
207
+ return zodTypeName(s) === 'ZodOptional';
208
+ }
209
+ function isZodDefault(s) {
210
+ return zodTypeName(s) === 'ZodDefault';
211
+ }
212
+ function isZodNullable(s) {
213
+ return zodTypeName(s) === 'ZodNullable';
214
+ }
215
+ function isZodLiteral(s) {
216
+ return zodTypeName(s) === 'ZodLiteral';
217
+ }
218
+ function isZodUnion(s) {
219
+ return zodTypeName(s) === 'ZodUnion';
220
+ }
221
+ function isZodRecord(s) {
222
+ return zodTypeName(s) === 'ZodRecord';
223
+ }
224
+ // ---------------------------------------------------------------------------
225
+ // Provider Format Converters
226
+ // ---------------------------------------------------------------------------
227
+ /**
228
+ * Convert a {@link ToolDefinition} into an {@link AnthropicTool}.
229
+ *
230
+ * @param tool - The tool definition to convert.
231
+ * @returns The tool in Anthropic Messages API format.
232
+ */
233
+ export function toAnthropicTool(tool) {
234
+ const jsonSchema = zodToJsonSchema(tool.inputSchema);
235
+ return {
236
+ name: tool.name,
237
+ description: tool.description,
238
+ input_schema: {
239
+ ...jsonSchema,
240
+ type: 'object',
241
+ },
242
+ };
243
+ }
244
+ /**
245
+ * Convert a {@link ToolDefinition} into an {@link OpenAITool}.
246
+ *
247
+ * @param tool - The tool definition to convert.
248
+ * @returns The tool in OpenAI function-calling format.
249
+ */
250
+ export function toOpenAITool(tool) {
251
+ return {
252
+ type: 'function',
253
+ function: {
254
+ name: tool.name,
255
+ description: tool.description,
256
+ parameters: zodToJsonSchema(tool.inputSchema),
257
+ },
258
+ };
259
+ }
260
+ /**
261
+ * Convert one or more {@link ToolDefinition}s into a single
262
+ * {@link GoogleTool} object (Google expects all declarations inside a
263
+ * single array).
264
+ *
265
+ * @param tools - The tool definitions to convert.
266
+ * @returns The tool in Google Generative AI format.
267
+ */
268
+ export function toGoogleTool(tools) {
269
+ return {
270
+ functionDeclarations: tools.map(tool => {
271
+ const jsonSchema = zodToJsonSchema(tool.inputSchema);
272
+ return {
273
+ name: tool.name,
274
+ description: tool.description,
275
+ parameters: {
276
+ ...jsonSchema,
277
+ type: 'OBJECT',
278
+ },
279
+ };
280
+ }),
281
+ };
282
+ }
283
+ // ---------------------------------------------------------------------------
284
+ // Tool Registry
285
+ // ---------------------------------------------------------------------------
286
+ /**
287
+ * Central, mutable registry that stores all available tool definitions.
288
+ *
289
+ * The registry is intentionally a plain class (not a singleton) so that
290
+ * tests can instantiate isolated instances. Production code should use
291
+ * the shared {@link defaultToolRegistry} export.
292
+ *
293
+ * @example
294
+ * ```ts
295
+ * const registry = new ToolRegistry();
296
+ * registry.register(readFileTool);
297
+ * registry.register(terraformApplyTool);
298
+ *
299
+ * const devopsTools = registry.getByCategory('devops');
300
+ * const anthropicPayload = registry.getAll().map(toAnthropicTool);
301
+ * ```
302
+ */
303
+ export class ToolRegistry {
304
+ /** Internal map keyed by tool name. */
305
+ tools = new Map();
306
+ /**
307
+ * Register a tool definition. Throws if a tool with the same name is
308
+ * already registered -- call {@link get} first if you need upsert
309
+ * semantics.
310
+ *
311
+ * @param tool - The tool definition to register.
312
+ * @throws {Error} If a tool with the same {@link ToolDefinition.name}
313
+ * already exists.
314
+ */
315
+ register(tool) {
316
+ if (this.tools.has(tool.name)) {
317
+ throw new Error(`ToolRegistry: tool '${tool.name}' is already registered. ` +
318
+ `Unregister it first or use a different name.`);
319
+ }
320
+ this.tools.set(tool.name, tool);
321
+ }
322
+ /**
323
+ * Retrieve a tool definition by name.
324
+ *
325
+ * @param name - The unique tool name.
326
+ * @returns The tool definition, or `undefined` if not found.
327
+ */
328
+ get(name) {
329
+ return this.tools.get(name);
330
+ }
331
+ /**
332
+ * Return every registered tool definition, in insertion order.
333
+ */
334
+ getAll() {
335
+ return Array.from(this.tools.values());
336
+ }
337
+ /**
338
+ * Return all tools that belong to the given {@link ToolCategory}.
339
+ *
340
+ * @param category - The category to filter by.
341
+ * @returns An array of matching tool definitions (may be empty).
342
+ */
343
+ getByCategory(category) {
344
+ return this.getAll().filter(t => t.category === category);
345
+ }
346
+ /**
347
+ * Return all tools that belong to the given {@link PermissionTier}.
348
+ *
349
+ * @param tier - The permission tier to filter by.
350
+ * @returns An array of matching tool definitions (may be empty).
351
+ */
352
+ getByPermissionTier(tier) {
353
+ return this.getAll().filter(t => t.permissionTier === tier);
354
+ }
355
+ /**
356
+ * Return the names of all registered tools, in insertion order.
357
+ */
358
+ getNames() {
359
+ return Array.from(this.tools.keys());
360
+ }
361
+ /**
362
+ * Remove a previously registered tool by name.
363
+ *
364
+ * @param name - The tool name to unregister.
365
+ * @returns `true` if the tool was found and removed, `false` otherwise.
366
+ */
367
+ unregister(name) {
368
+ return this.tools.delete(name);
369
+ }
370
+ /**
371
+ * Remove all registered tools. Primarily useful in tests.
372
+ */
373
+ clear() {
374
+ this.tools.clear();
375
+ }
376
+ /**
377
+ * The number of currently registered tools.
378
+ */
379
+ get size() {
380
+ return this.tools.size;
381
+ }
382
+ /**
383
+ * Convert all registered tools to the Anthropic Messages API format.
384
+ */
385
+ toAnthropicTools() {
386
+ return this.getAll().map(toAnthropicTool);
387
+ }
388
+ /**
389
+ * Convert all registered tools to the OpenAI function-calling format.
390
+ */
391
+ toOpenAITools() {
392
+ return this.getAll().map(toOpenAITool);
393
+ }
394
+ /**
395
+ * Convert all registered tools to a single Google Generative AI tool
396
+ * object.
397
+ */
398
+ toGoogleTool() {
399
+ return toGoogleTool(this.getAll());
400
+ }
401
+ }
402
+ // ---------------------------------------------------------------------------
403
+ // Shared Default Instance
404
+ // ---------------------------------------------------------------------------
405
+ /**
406
+ * Application-wide tool registry instance. Import this wherever you need
407
+ * to register or look up tools at runtime.
408
+ */
409
+ export const defaultToolRegistry = new ToolRegistry();
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Streaming subprocess wrapper.
3
+ *
4
+ * Replaces `promisify(exec)` for long-running DevOps commands (terraform,
5
+ * kubectl, helm, bash). Unlike `execAsync`, this streams stdout/stderr chunks
6
+ * in real-time via the `onChunk` callback so the TUI can show live output
7
+ * instead of a frozen spinner for multi-minute operations.
8
+ */
9
+ import { spawn } from 'node:child_process';
10
+ // ---------------------------------------------------------------------------
11
+ // Secret redaction
12
+ // ---------------------------------------------------------------------------
13
+ const SECRET_PATTERNS = [
14
+ /AKIA[0-9A-Z]{16}/g,
15
+ /(?:password|secret|token|key)\s*[:=]\s*\S+/gi,
16
+ /Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,
17
+ ];
18
+ function redactSecrets(text) {
19
+ return SECRET_PATTERNS.reduce((t, p) => t.replace(p, '[REDACTED]'), text);
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // Implementation
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Spawn a shell command and stream its output in real-time.
26
+ *
27
+ * - stdout and stderr are both captured and forwarded to `onChunk`.
28
+ * - The returned promise resolves with the full stdout, stderr, and exit code.
29
+ * - If `timeout` is set, the process is killed after that many milliseconds
30
+ * and the promise rejects with a timeout error.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const result = await spawnExec('terraform apply -auto-approve', {
35
+ * cwd: '/infra/aws',
36
+ * onChunk: (chunk) => process.stdout.write(chunk),
37
+ * });
38
+ * ```
39
+ */
40
+ export async function spawnExec(command, options = {}) {
41
+ return new Promise((resolve, reject) => {
42
+ const proc = spawn('sh', ['-c', command], {
43
+ cwd: options.cwd,
44
+ env: options.env ?? process.env,
45
+ });
46
+ let stdout = '';
47
+ let stderr = '';
48
+ // Buffer chunks and flush every 100ms to avoid excessive re-renders
49
+ let buffer = '';
50
+ const flushInterval = setInterval(() => {
51
+ if (buffer && options.onChunk) {
52
+ options.onChunk(buffer);
53
+ buffer = '';
54
+ }
55
+ }, 100);
56
+ proc.stdout.on('data', (chunk) => {
57
+ const text = chunk.toString();
58
+ stdout += text;
59
+ buffer += redactSecrets(text);
60
+ });
61
+ proc.stderr.on('data', (chunk) => {
62
+ const text = chunk.toString();
63
+ stderr += text;
64
+ // C5: Prefix each stderr line with dim-red ANSI so ToolCallDisplay renders them distinctly
65
+ const tagged = text.split('\n').map(l => l ? `\x1b[2;31m${l}\x1b[0m` : l).join('\n');
66
+ buffer += tagged;
67
+ });
68
+ proc.on('close', (code) => {
69
+ clearInterval(flushInterval);
70
+ // Flush any remaining buffered content
71
+ if (buffer && options.onChunk) {
72
+ options.onChunk(buffer);
73
+ buffer = '';
74
+ }
75
+ resolve({ stdout, stderr, exitCode: code ?? 0 });
76
+ });
77
+ proc.on('error', (err) => {
78
+ clearInterval(flushInterval);
79
+ reject(err);
80
+ });
81
+ // GAP-9: AbortSignal support — kill process and reject on abort
82
+ if (options.signal) {
83
+ const abortHandler = () => {
84
+ try {
85
+ proc.kill('SIGTERM');
86
+ }
87
+ catch { /* ignore */ }
88
+ clearInterval(flushInterval);
89
+ reject(new Error('Operation cancelled by user (Ctrl+C)'));
90
+ };
91
+ options.signal.addEventListener('abort', abortHandler, { once: true });
92
+ proc.on('close', () => {
93
+ try {
94
+ options.signal?.removeEventListener('abort', abortHandler);
95
+ }
96
+ catch { /* ignore */ }
97
+ });
98
+ }
99
+ if (options.timeout) {
100
+ setTimeout(() => {
101
+ proc.kill();
102
+ clearInterval(flushInterval);
103
+ const toolLabel = options.label ?? command.split(' ')[0];
104
+ const seconds = Math.round(options.timeout / 1000);
105
+ reject(new Error(`[${toolLabel}] timed out after ${seconds}s. Override via NIMBUS.md "## Tool Timeouts".`));
106
+ }, options.timeout);
107
+ }
108
+ });
109
+ }