@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,451 @@
1
+ /**
2
+ * FileSystem Operations — Embedded tool (stripped HTTP wrappers)
3
+ *
4
+ * Copied from services/fs-tools-service/src/fs/operations.ts
5
+ * Provides direct filesystem operations for the embedded CLI binary.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as fsSync from 'fs';
9
+ import * as path from 'path';
10
+ import { glob } from 'fast-glob';
11
+ import { exec } from 'child_process';
12
+ import { promisify } from 'util';
13
+ import { logger } from '../utils';
14
+ const execAsync = promisify(exec);
15
+ /**
16
+ * Sensitive file patterns that should be blocked from access
17
+ */
18
+ const SENSITIVE_PATTERNS = [
19
+ /\.env(\.|$)/i, // .env, .env.local, .env.production
20
+ /credentials/i, // AWS credentials, any credentials file
21
+ /\.pem$/i, // PEM certificates
22
+ /\.key$/i, // Private keys
23
+ /id_rsa/i, // SSH keys
24
+ /id_ed25519/i, // SSH keys (Ed25519)
25
+ /id_ecdsa/i, // SSH keys (ECDSA)
26
+ /\.ssh[/\\]/i, // Anything inside .ssh directory
27
+ /\/etc\/shadow$/, // Unix shadow passwords
28
+ /\/etc\/passwd$/, // Unix passwords
29
+ /\.aws[/\\]credentials/i, // AWS credentials file specifically
30
+ /\.kube[/\\]config/i, // Kubeconfig with cluster secrets
31
+ ];
32
+ export class FileSystemOperations {
33
+ basePath;
34
+ constructor(basePath = process.cwd()) {
35
+ this.basePath = basePath;
36
+ }
37
+ /**
38
+ * Check if a resolved path points to a sensitive file
39
+ */
40
+ assertNotSensitive(resolvedPath) {
41
+ if (process.env.ALLOW_SENSITIVE_FILES === 'true') {
42
+ return;
43
+ }
44
+ const normalized = path.resolve(resolvedPath);
45
+ const basename = path.basename(normalized);
46
+ for (const pattern of SENSITIVE_PATTERNS) {
47
+ if (pattern.test(basename) || pattern.test(normalized)) {
48
+ throw new Error(`Access denied: reading sensitive file '${basename}' is blocked for security`);
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * Resolve path relative to base path
54
+ */
55
+ resolvePath(filePath) {
56
+ const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(this.basePath, filePath);
57
+ this.assertNotSensitive(resolved);
58
+ return resolved;
59
+ }
60
+ /**
61
+ * Read file content
62
+ */
63
+ async readFile(filePath, encoding = 'utf-8') {
64
+ const resolvedPath = this.resolvePath(filePath);
65
+ logger.info(`Reading file: ${resolvedPath}`);
66
+ // Guard against large files that would overflow the context window.
67
+ // Warn and truncate at 500 KB — enough for most source files.
68
+ const MAX_READ_BYTES = 500 * 1024;
69
+ const stat = await fs.stat(resolvedPath);
70
+ if (stat.size > MAX_READ_BYTES) {
71
+ const buffer = Buffer.alloc(MAX_READ_BYTES);
72
+ const fd = await fs.open(resolvedPath, 'r');
73
+ let bytesRead = 0;
74
+ try {
75
+ const result = await fd.read(buffer, 0, MAX_READ_BYTES, 0);
76
+ bytesRead = result.bytesRead;
77
+ }
78
+ finally {
79
+ await fd.close();
80
+ }
81
+ const truncated = buffer.slice(0, bytesRead).toString(encoding);
82
+ return (truncated +
83
+ `\n\n[File truncated: ${(stat.size / 1024).toFixed(1)} KB total, showing first ${(bytesRead / 1024).toFixed(0)} KB. ` +
84
+ `Use line range parameters to read specific sections.]`);
85
+ }
86
+ const content = await fs.readFile(resolvedPath, encoding);
87
+ return content;
88
+ }
89
+ /**
90
+ * Read file as binary
91
+ */
92
+ async readFileBuffer(filePath) {
93
+ const resolvedPath = this.resolvePath(filePath);
94
+ logger.info(`Reading file as buffer: ${resolvedPath}`);
95
+ return await fs.readFile(resolvedPath);
96
+ }
97
+ /**
98
+ * Write content to file
99
+ */
100
+ async writeFile(filePath, content, options) {
101
+ const resolvedPath = this.resolvePath(filePath);
102
+ logger.info(`Writing file: ${resolvedPath}`);
103
+ if (options?.createDirs) {
104
+ await fs.mkdir(path.dirname(resolvedPath), { recursive: true });
105
+ }
106
+ await fs.writeFile(resolvedPath, content, 'utf-8');
107
+ return { success: true, path: resolvedPath };
108
+ }
109
+ /**
110
+ * Append content to file
111
+ */
112
+ async appendFile(filePath, content) {
113
+ const resolvedPath = this.resolvePath(filePath);
114
+ logger.info(`Appending to file: ${resolvedPath}`);
115
+ await fs.appendFile(resolvedPath, content, 'utf-8');
116
+ return { success: true, path: resolvedPath };
117
+ }
118
+ /**
119
+ * List files and directories
120
+ */
121
+ async list(directory, options = {}) {
122
+ const resolvedPath = this.resolvePath(directory);
123
+ logger.info(`Listing directory: ${resolvedPath}`);
124
+ const pattern = options.pattern || '*';
125
+ const fullPattern = options.recursive
126
+ ? path.join(resolvedPath, '**', pattern)
127
+ : path.join(resolvedPath, pattern);
128
+ const entries = await glob(fullPattern, {
129
+ dot: options.includeHidden,
130
+ onlyFiles: options.onlyFiles,
131
+ onlyDirectories: options.onlyDirectories,
132
+ absolute: true,
133
+ });
134
+ return entries;
135
+ }
136
+ /**
137
+ * Search for content in files using ripgrep (if available) or built-in search
138
+ */
139
+ async search(directory, options) {
140
+ const resolvedPath = this.resolvePath(directory);
141
+ logger.info(`Searching in ${resolvedPath} for pattern: ${options.pattern}`);
142
+ // Try ripgrep first for performance
143
+ try {
144
+ return await this.searchWithRipgrep(resolvedPath, options);
145
+ }
146
+ catch {
147
+ // Fall back to built-in search
148
+ return await this.searchBuiltin(resolvedPath, options);
149
+ }
150
+ }
151
+ async searchWithRipgrep(directory, options) {
152
+ const args = ['--json', '--line-number', '--column'];
153
+ if (!options.caseSensitive) {
154
+ args.push('-i');
155
+ }
156
+ if (options.wholeWord) {
157
+ args.push('-w');
158
+ }
159
+ if (options.maxResults) {
160
+ args.push('-m', options.maxResults.toString());
161
+ }
162
+ if (options.filePattern) {
163
+ args.push('-g', options.filePattern);
164
+ }
165
+ const command = `rg ${args.join(' ')} "${options.pattern}" "${directory}"`;
166
+ const { stdout } = await execAsync(command, { maxBuffer: 10 * 1024 * 1024 });
167
+ const results = [];
168
+ const lines = stdout
169
+ .trim()
170
+ .split('\n')
171
+ .filter(line => line);
172
+ for (const line of lines) {
173
+ try {
174
+ const parsed = JSON.parse(line);
175
+ if (parsed.type === 'match') {
176
+ results.push({
177
+ file: parsed.data.path.text,
178
+ line: parsed.data.line_number,
179
+ column: parsed.data.submatches[0]?.start || 0,
180
+ match: parsed.data.lines.text.trim(),
181
+ context: options.includeContext ? parsed.data.lines.text : undefined,
182
+ });
183
+ }
184
+ }
185
+ catch {
186
+ // Skip malformed lines
187
+ }
188
+ }
189
+ return results;
190
+ }
191
+ async searchBuiltin(directory, options) {
192
+ const results = [];
193
+ const pattern = options.caseSensitive
194
+ ? new RegExp(options.pattern, 'g')
195
+ : new RegExp(options.pattern, 'gi');
196
+ const files = await this.list(directory, {
197
+ recursive: true,
198
+ onlyFiles: true,
199
+ pattern: options.filePattern || '*',
200
+ });
201
+ for (const file of files) {
202
+ try {
203
+ const content = await this.readFile(file);
204
+ const lines = content.split('\n');
205
+ for (let i = 0; i < lines.length; i++) {
206
+ const line = lines[i];
207
+ let match;
208
+ while ((match = pattern.exec(line)) !== null) {
209
+ results.push({
210
+ file,
211
+ line: i + 1,
212
+ column: match.index,
213
+ match: line.trim(),
214
+ context: options.includeContext ? line : undefined,
215
+ });
216
+ if (options.maxResults && results.length >= options.maxResults) {
217
+ return results;
218
+ }
219
+ }
220
+ }
221
+ }
222
+ catch {
223
+ // Skip files that can't be read
224
+ }
225
+ }
226
+ return results;
227
+ }
228
+ /**
229
+ * Generate directory tree
230
+ */
231
+ async tree(directory, options = {}) {
232
+ const resolvedPath = this.resolvePath(directory);
233
+ logger.info(`Generating tree for: ${resolvedPath}`);
234
+ const maxDepth = options.maxDepth ?? 5;
235
+ const buildTree = async (dir, depth) => {
236
+ const stats = await fs.stat(dir);
237
+ const name = path.basename(dir);
238
+ const node = {
239
+ name,
240
+ path: dir,
241
+ type: stats.isDirectory() ? 'directory' : 'file',
242
+ size: stats.isFile() ? stats.size : undefined,
243
+ };
244
+ if (stats.isDirectory() && depth < maxDepth) {
245
+ const entries = await fs.readdir(dir, { withFileTypes: true });
246
+ node.children = [];
247
+ for (const entry of entries) {
248
+ // Skip hidden files if not requested
249
+ if (!options.includeHidden && entry.name.startsWith('.')) {
250
+ continue;
251
+ }
252
+ // Skip files if not requested
253
+ if (!options.includeFiles && entry.isFile()) {
254
+ continue;
255
+ }
256
+ const entryPath = path.join(dir, entry.name);
257
+ const childNode = await buildTree(entryPath, depth + 1);
258
+ node.children.push(childNode);
259
+ }
260
+ // Sort: directories first, then alphabetically
261
+ node.children.sort((a, b) => {
262
+ if (a.type !== b.type) {
263
+ return a.type === 'directory' ? -1 : 1;
264
+ }
265
+ return a.name.localeCompare(b.name);
266
+ });
267
+ }
268
+ return node;
269
+ };
270
+ return await buildTree(resolvedPath, 0);
271
+ }
272
+ /**
273
+ * Get file diff using system diff command
274
+ */
275
+ async diff(file1, file2, options) {
276
+ const path1 = this.resolvePath(file1);
277
+ const path2 = this.resolvePath(file2);
278
+ logger.info(`Diffing ${path1} and ${path2}`);
279
+ const args = [];
280
+ if (options?.unified !== undefined) {
281
+ args.push(`-U${options.unified}`);
282
+ }
283
+ else {
284
+ args.push('-u'); // Default unified format
285
+ }
286
+ if (options?.ignoreWhitespace) {
287
+ args.push('-w');
288
+ }
289
+ try {
290
+ const { stdout } = await execAsync(`diff ${args.join(' ')} "${path1}" "${path2}"`);
291
+ return stdout;
292
+ }
293
+ catch (error) {
294
+ // diff returns exit code 1 when files are different
295
+ if (error.stdout) {
296
+ return error.stdout;
297
+ }
298
+ throw error;
299
+ }
300
+ }
301
+ /**
302
+ * Copy file or directory
303
+ */
304
+ async copy(source, destination, options) {
305
+ const srcPath = this.resolvePath(source);
306
+ const destPath = this.resolvePath(destination);
307
+ logger.info(`Copying ${srcPath} to ${destPath}`);
308
+ const srcStats = await fs.stat(srcPath);
309
+ if (srcStats.isDirectory()) {
310
+ if (!options?.recursive) {
311
+ throw new Error('Cannot copy directory without recursive option');
312
+ }
313
+ await this.copyDir(srcPath, destPath, options?.overwrite);
314
+ }
315
+ else {
316
+ await fs.mkdir(path.dirname(destPath), { recursive: true });
317
+ if (!options?.overwrite) {
318
+ try {
319
+ await fs.access(destPath);
320
+ throw new Error(`Destination file already exists: ${destPath}`);
321
+ }
322
+ catch (e) {
323
+ if (e.code !== 'ENOENT') {
324
+ throw e;
325
+ }
326
+ }
327
+ }
328
+ await fs.copyFile(srcPath, destPath);
329
+ }
330
+ return { success: true, source: srcPath, destination: destPath };
331
+ }
332
+ async copyDir(src, dest, overwrite) {
333
+ await fs.mkdir(dest, { recursive: true });
334
+ const entries = await fs.readdir(src, { withFileTypes: true });
335
+ for (const entry of entries) {
336
+ const srcPath = path.join(src, entry.name);
337
+ const destPath = path.join(dest, entry.name);
338
+ if (entry.isDirectory()) {
339
+ await this.copyDir(srcPath, destPath, overwrite);
340
+ }
341
+ else {
342
+ if (!overwrite) {
343
+ try {
344
+ await fs.access(destPath);
345
+ continue; // Skip existing files
346
+ }
347
+ catch {
348
+ // File doesn't exist, proceed with copy
349
+ }
350
+ }
351
+ await fs.copyFile(srcPath, destPath);
352
+ }
353
+ }
354
+ }
355
+ /**
356
+ * Move/rename file or directory
357
+ */
358
+ async move(source, destination) {
359
+ const srcPath = this.resolvePath(source);
360
+ const destPath = this.resolvePath(destination);
361
+ logger.info(`Moving ${srcPath} to ${destPath}`);
362
+ await fs.mkdir(path.dirname(destPath), { recursive: true });
363
+ await fs.rename(srcPath, destPath);
364
+ return { success: true, source: srcPath, destination: destPath };
365
+ }
366
+ /**
367
+ * Delete file or directory
368
+ */
369
+ async delete(filePath, options) {
370
+ const resolvedPath = this.resolvePath(filePath);
371
+ logger.info(`Deleting: ${resolvedPath}`);
372
+ const stats = await fs.stat(resolvedPath);
373
+ if (stats.isDirectory()) {
374
+ if (!options?.recursive) {
375
+ throw new Error('Cannot delete directory without recursive option');
376
+ }
377
+ await fs.rm(resolvedPath, { recursive: true, force: options?.force });
378
+ }
379
+ else {
380
+ await fs.unlink(resolvedPath);
381
+ }
382
+ return { success: true, path: resolvedPath };
383
+ }
384
+ /**
385
+ * Create directory
386
+ */
387
+ async mkdir(dirPath, options) {
388
+ const resolvedPath = this.resolvePath(dirPath);
389
+ logger.info(`Creating directory: ${resolvedPath}`);
390
+ await fs.mkdir(resolvedPath, { recursive: options?.recursive ?? true });
391
+ return { success: true, path: resolvedPath };
392
+ }
393
+ /**
394
+ * Check if file or directory exists
395
+ */
396
+ async exists(filePath) {
397
+ const resolvedPath = this.resolvePath(filePath);
398
+ try {
399
+ await fs.access(resolvedPath);
400
+ return true;
401
+ }
402
+ catch {
403
+ return false;
404
+ }
405
+ }
406
+ /**
407
+ * Get file stats
408
+ */
409
+ async stat(filePath) {
410
+ const resolvedPath = this.resolvePath(filePath);
411
+ logger.info(`Getting stats for: ${resolvedPath}`);
412
+ const stats = await fs.stat(resolvedPath);
413
+ const lstat = await fs.lstat(resolvedPath);
414
+ return {
415
+ size: stats.size,
416
+ isFile: stats.isFile(),
417
+ isDirectory: stats.isDirectory(),
418
+ isSymbolicLink: lstat.isSymbolicLink(),
419
+ createdAt: stats.birthtime,
420
+ modifiedAt: stats.mtime,
421
+ accessedAt: stats.atime,
422
+ permissions: (stats.mode & 0o777).toString(8),
423
+ };
424
+ }
425
+ /**
426
+ * Read directory entries
427
+ */
428
+ async readDir(dirPath) {
429
+ const resolvedPath = this.resolvePath(dirPath);
430
+ logger.info(`Reading directory: ${resolvedPath}`);
431
+ const entries = await fs.readdir(resolvedPath, { withFileTypes: true });
432
+ return entries.map(entry => ({
433
+ name: entry.name,
434
+ type: entry.isDirectory() ? 'directory' : entry.isSymbolicLink() ? 'symlink' : 'file',
435
+ }));
436
+ }
437
+ /**
438
+ * Watch for file changes
439
+ */
440
+ watch(filePath, callback) {
441
+ const resolvedPath = this.resolvePath(filePath);
442
+ logger.info(`Watching: ${resolvedPath}`);
443
+ const watcher = fsSync.watch(resolvedPath, { recursive: true }, (event, filename) => {
444
+ callback(event, filename);
445
+ });
446
+ // Return a cleanup function
447
+ return () => {
448
+ watcher.close();
449
+ };
450
+ }
451
+ }