@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,512 @@
1
+ /**
2
+ * Enterprise Billing - Subscription management and usage tracking.
3
+ *
4
+ * Embedded replacement for services/billing-service.
5
+ * All business logic is preserved verbatim from:
6
+ * - services/billing-service/src/routes/subscriptions.ts
7
+ * - services/billing-service/src/routes/usage.ts
8
+ *
9
+ * HTTP handlers, routes, and per-service SQLite are stripped.
10
+ * State is read/written through the unified database via ../state/billing.
11
+ */
12
+ import { createSubscription as stateCreateSubscription, getSubscription as stateGetSubscription, updateSubscription as stateUpdateSubscription, recordUsage as stateRecordUsage, getUsage as stateGetUsage, getUsageSummary as stateGetUsageSummary, } from '../state/billing';
13
+ const PLAN_CATALOG = {
14
+ free: {
15
+ name: 'Nimbus Free',
16
+ stripe_price_id: 'price_demo_free_monthly',
17
+ amount_cents: 0,
18
+ currency: 'usd',
19
+ interval: 'month',
20
+ seats_included: 5,
21
+ features: [
22
+ '5 team members',
23
+ '100K tokens/month',
24
+ 'Community support',
25
+ 'Basic Terraform generation',
26
+ ],
27
+ },
28
+ pro: {
29
+ name: 'Nimbus Pro',
30
+ stripe_price_id: 'price_demo_pro_monthly',
31
+ amount_cents: 4900,
32
+ currency: 'usd',
33
+ interval: 'month',
34
+ seats_included: 25,
35
+ features: [
36
+ '25 team members',
37
+ '5M tokens/month',
38
+ 'Priority support',
39
+ 'Multi-cloud generation',
40
+ 'Drift detection',
41
+ 'Cost optimization',
42
+ 'Helm & K8s generation',
43
+ ],
44
+ },
45
+ enterprise: {
46
+ name: 'Nimbus Enterprise',
47
+ stripe_price_id: 'price_demo_enterprise_monthly',
48
+ amount_cents: 19900,
49
+ currency: 'usd',
50
+ interval: 'month',
51
+ seats_included: 100,
52
+ features: [
53
+ 'Unlimited team members',
54
+ 'Unlimited tokens',
55
+ 'Dedicated support & SLA',
56
+ 'SSO / SAML integration',
57
+ 'Audit log export',
58
+ 'Custom policy engine',
59
+ 'Private deployment option',
60
+ 'Advanced RBAC',
61
+ ],
62
+ },
63
+ };
64
+ const VALID_PLANS = ['free', 'pro', 'enterprise'];
65
+ const PLAN_QUOTAS = {
66
+ free: {
67
+ tokensPerMonth: 100_000,
68
+ operationsPerMonth: 500,
69
+ costCapUsd: 0,
70
+ },
71
+ pro: {
72
+ tokensPerMonth: 5_000_000,
73
+ operationsPerMonth: 25_000,
74
+ costCapUsd: 100,
75
+ },
76
+ enterprise: {
77
+ tokensPerMonth: -1, // unlimited
78
+ operationsPerMonth: -1,
79
+ costCapUsd: -1,
80
+ },
81
+ };
82
+ // ---------------------------------------------------------------------------
83
+ // Private helpers
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Generate a random alphanumeric demo ID of the given length.
87
+ * Preserved verbatim from billing-service/src/db/adapter.ts.
88
+ */
89
+ function generateDemoId(length) {
90
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
91
+ let result = '';
92
+ for (let i = 0; i < length; i++) {
93
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
94
+ }
95
+ return result;
96
+ }
97
+ /**
98
+ * Build a realistic Stripe-format subscription object for demo presentations.
99
+ * Preserved verbatim from billing-service/src/routes/subscriptions.ts.
100
+ */
101
+ function buildStripeSubscription(teamId, plan, stripeSubId, stripeCustomerId, periodStart, periodEnd, seats, canceled = false, canceledAt = null) {
102
+ const planDetails = PLAN_CATALOG[plan] || PLAN_CATALOG.pro;
103
+ const createdTimestamp = Math.floor((periodStart.getTime() - 5000) / 1000);
104
+ const periodStartUnix = Math.floor(periodStart.getTime() / 1000);
105
+ const periodEndUnix = Math.floor(periodEnd.getTime() / 1000);
106
+ const invoiceId = `in_demo_${generateDemoId(24)}`;
107
+ const invoiceNumber = `NIM-${periodStart.getFullYear()}${String(periodStart.getMonth() + 1).padStart(2, '0')}-${String(Math.floor(Math.random() * 9999) + 1).padStart(4, '0')}`;
108
+ const seatAmount = planDetails.amount_cents * seats;
109
+ return {
110
+ id: stripeSubId,
111
+ object: 'subscription',
112
+ customer: stripeCustomerId,
113
+ status: canceled ? 'canceled' : 'active',
114
+ current_period_start: periodStartUnix,
115
+ current_period_end: periodEndUnix,
116
+ created: createdTimestamp,
117
+ cancel_at_period_end: canceled,
118
+ canceled_at: canceledAt ? Math.floor(canceledAt.getTime() / 1000) : null,
119
+ plan: {
120
+ id: planDetails.stripe_price_id,
121
+ object: 'plan',
122
+ product: `prod_demo_nimbus_${plan}`,
123
+ nickname: planDetails.name,
124
+ amount: planDetails.amount_cents,
125
+ currency: planDetails.currency,
126
+ interval: planDetails.interval,
127
+ interval_count: 1,
128
+ active: true,
129
+ },
130
+ items: {
131
+ object: 'list',
132
+ data: [
133
+ {
134
+ id: `si_demo_${generateDemoId(14)}`,
135
+ object: 'subscription_item',
136
+ price: {
137
+ id: planDetails.stripe_price_id,
138
+ object: 'price',
139
+ unit_amount: planDetails.amount_cents,
140
+ currency: planDetails.currency,
141
+ recurring: { interval: planDetails.interval, interval_count: 1 },
142
+ product: `prod_demo_nimbus_${plan}`,
143
+ },
144
+ quantity: seats,
145
+ },
146
+ ],
147
+ total_count: 1,
148
+ },
149
+ latest_invoice: {
150
+ id: invoiceId,
151
+ object: 'invoice',
152
+ number: invoiceNumber,
153
+ status: 'paid',
154
+ amount_due: seatAmount,
155
+ amount_paid: seatAmount,
156
+ currency: planDetails.currency,
157
+ customer_email: `billing+${teamId}@nimbus.dev`,
158
+ period_start: periodStartUnix,
159
+ period_end: periodEndUnix,
160
+ subtotal: seatAmount,
161
+ tax: 0,
162
+ total: seatAmount,
163
+ lines: {
164
+ object: 'list',
165
+ data: [
166
+ {
167
+ id: `il_demo_${generateDemoId(14)}`,
168
+ object: 'line_item',
169
+ description: `${planDetails.name} (${seats} seat${seats !== 1 ? 's' : ''} x $${(planDetails.amount_cents / 100).toFixed(2)}/mo)`,
170
+ amount: seatAmount,
171
+ currency: planDetails.currency,
172
+ quantity: seats,
173
+ period: { start: periodStartUnix, end: periodEndUnix },
174
+ },
175
+ ],
176
+ total_count: 1,
177
+ },
178
+ payment_intent: {
179
+ id: `pi_demo_${generateDemoId(24)}`,
180
+ object: 'payment_intent',
181
+ status: 'succeeded',
182
+ amount: seatAmount,
183
+ currency: planDetails.currency,
184
+ },
185
+ hosted_invoice_url: `https://invoice.stripe.com/i/demo/${invoiceId}`,
186
+ invoice_pdf: `https://pay.stripe.com/invoice/${invoiceId}/pdf`,
187
+ created: createdTimestamp,
188
+ },
189
+ metadata: {
190
+ team_id: teamId,
191
+ plan_name: planDetails.name,
192
+ provisioned_by: 'nimbus-billing-service',
193
+ },
194
+ default_payment_method: {
195
+ id: `pm_demo_${generateDemoId(14)}`,
196
+ object: 'payment_method',
197
+ type: 'card',
198
+ card: {
199
+ brand: 'visa',
200
+ last4: '4242',
201
+ exp_month: 12,
202
+ exp_year: new Date().getFullYear() + 2,
203
+ funding: 'credit',
204
+ },
205
+ },
206
+ };
207
+ }
208
+ /**
209
+ * Build quota status relative to the team's plan.
210
+ * Preserved verbatim from billing-service/src/routes/usage.ts.
211
+ */
212
+ function buildQuota(plan, totalTokens, totalOperations, totalCost) {
213
+ const quota = PLAN_QUOTAS[plan] || PLAN_QUOTAS.free;
214
+ const unlimited = plan === 'enterprise';
215
+ const tokensLimit = quota.tokensPerMonth;
216
+ const opsLimit = quota.operationsPerMonth;
217
+ const costCap = quota.costCapUsd;
218
+ return {
219
+ plan,
220
+ tokens: {
221
+ used: totalTokens,
222
+ limit: unlimited ? -1 : tokensLimit,
223
+ remaining: unlimited ? -1 : Math.max(0, tokensLimit - totalTokens),
224
+ percentUsed: unlimited
225
+ ? 0
226
+ : tokensLimit > 0
227
+ ? Math.min(100, Math.round((totalTokens / tokensLimit) * 100 * 100) / 100)
228
+ : 0,
229
+ unlimited,
230
+ },
231
+ operations: {
232
+ used: totalOperations,
233
+ limit: unlimited ? -1 : opsLimit,
234
+ remaining: unlimited ? -1 : Math.max(0, opsLimit - totalOperations),
235
+ percentUsed: unlimited
236
+ ? 0
237
+ : opsLimit > 0
238
+ ? Math.min(100, Math.round((totalOperations / opsLimit) * 100 * 100) / 100)
239
+ : 0,
240
+ unlimited,
241
+ },
242
+ cost: {
243
+ accrued: Math.round(totalCost * 100) / 100,
244
+ cap: unlimited ? -1 : costCap,
245
+ remaining: unlimited ? -1 : Math.max(0, Math.round((costCap - totalCost) * 100) / 100),
246
+ percentUsed: unlimited
247
+ ? 0
248
+ : costCap > 0
249
+ ? Math.min(100, Math.round((totalCost / costCap) * 100 * 100) / 100)
250
+ : 0,
251
+ unlimited,
252
+ },
253
+ };
254
+ }
255
+ /**
256
+ * Build rate limit metadata for the current billing window.
257
+ * Preserved verbatim from billing-service/src/routes/usage.ts.
258
+ */
259
+ function buildRateLimit(plan) {
260
+ const limits = {
261
+ free: { rpm: 30, tpm: 10_000 },
262
+ pro: { rpm: 120, tpm: 100_000 },
263
+ enterprise: { rpm: 600, tpm: 1_000_000 },
264
+ };
265
+ const planLimits = limits[plan] || limits.free;
266
+ return {
267
+ requestsPerMinute: planLimits.rpm,
268
+ tokensPerMinute: planLimits.tpm,
269
+ // Simulated current-minute counters (low values for demo)
270
+ currentMinuteRequests: Math.floor(Math.random() * 5),
271
+ currentMinuteTokens: Math.floor(Math.random() * 2000),
272
+ };
273
+ }
274
+ // ---------------------------------------------------------------------------
275
+ // Public API - Subscriptions
276
+ // ---------------------------------------------------------------------------
277
+ /**
278
+ * Get the current billing status for a team.
279
+ *
280
+ * Returns free-plan defaults when no subscription record exists.
281
+ */
282
+ export async function getBillingStatus(teamId) {
283
+ const subscription = stateGetSubscription(teamId);
284
+ if (!subscription) {
285
+ return {
286
+ plan: 'free',
287
+ status: 'active',
288
+ currentPeriodStart: new Date().toISOString(),
289
+ currentPeriodEnd: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
290
+ cancelAtPeriodEnd: false,
291
+ seats: {
292
+ used: 1,
293
+ total: 5,
294
+ },
295
+ };
296
+ }
297
+ // The unified billing schema (src/state/billing.ts) stores status directly
298
+ // and does not have cancel_at_period_end or seats_used/seats_total columns.
299
+ // We derive cancelAtPeriodEnd from status === 'canceled' for backward
300
+ // compatibility with the original service response shape.
301
+ return {
302
+ plan: subscription.plan,
303
+ status: subscription.status,
304
+ currentPeriodStart: subscription.currentPeriodStart || new Date().toISOString(),
305
+ currentPeriodEnd: subscription.currentPeriodEnd ||
306
+ new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
307
+ cancelAtPeriodEnd: subscription.status === 'canceled',
308
+ seats: {
309
+ used: 1, // seat tracking not available in the unified schema; caller can augment
310
+ total: PLAN_CATALOG[subscription.plan]?.seats_included ?? 5,
311
+ },
312
+ };
313
+ }
314
+ /**
315
+ * Subscribe a team to a plan.
316
+ *
317
+ * Creates or updates the subscription record in the unified database and
318
+ * returns a rich Stripe-like subscription object for demo presentations.
319
+ */
320
+ export async function subscribe(request) {
321
+ const { teamId, plan, seats } = request;
322
+ if (!teamId) {
323
+ throw new Error('Team ID is required');
324
+ }
325
+ if (!VALID_PLANS.includes(plan)) {
326
+ throw new Error(`Invalid plan: ${plan}. Must be one of: ${VALID_PLANS.join(', ')}`);
327
+ }
328
+ const stripeSubscriptionId = `sub_demo_${generateDemoId(24)}`;
329
+ const periodStart = new Date();
330
+ const periodEnd = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000);
331
+ const seatsTotal = seats || (plan === 'enterprise' ? 100 : plan === 'pro' ? 25 : 5);
332
+ const stripeCustomerId = `cus_demo_${generateDemoId(14)}`;
333
+ const existing = stateGetSubscription(teamId);
334
+ if (existing) {
335
+ stateUpdateSubscription(teamId, {
336
+ plan,
337
+ status: 'active',
338
+ currentPeriodStart: periodStart.toISOString(),
339
+ currentPeriodEnd: periodEnd.toISOString(),
340
+ });
341
+ }
342
+ else {
343
+ stateCreateSubscription(crypto.randomUUID(), teamId, plan, 'active', periodStart.toISOString(), periodEnd.toISOString());
344
+ }
345
+ const billingStatus = await getBillingStatus(teamId);
346
+ const stripeObject = buildStripeSubscription(teamId, plan, stripeSubscriptionId, stripeCustomerId, periodStart, periodEnd, seatsTotal);
347
+ return {
348
+ billing: billingStatus,
349
+ stripe: stripeObject,
350
+ };
351
+ }
352
+ /**
353
+ * Cancel a team's active subscription.
354
+ *
355
+ * Marks the subscription as canceled in the unified database and returns a
356
+ * Stripe-like cancellation confirmation object.
357
+ */
358
+ export async function cancelSubscription(teamId) {
359
+ if (!teamId) {
360
+ throw new Error('Team ID is required');
361
+ }
362
+ const subscription = stateGetSubscription(teamId);
363
+ if (!subscription) {
364
+ throw new Error('No subscription found');
365
+ }
366
+ if (subscription.plan === 'free') {
367
+ throw new Error('Cannot cancel free plan');
368
+ }
369
+ const canceledAt = new Date();
370
+ stateUpdateSubscription(teamId, { status: 'canceled' });
371
+ const billingStatus = await getBillingStatus(teamId);
372
+ const periodEnd = subscription.currentPeriodEnd
373
+ ? new Date(subscription.currentPeriodEnd)
374
+ : new Date(Date.now() + 30 * 24 * 60 * 60 * 1000);
375
+ return {
376
+ billing: billingStatus,
377
+ cancellation: {
378
+ id: `sub_demo_${generateDemoId(24)}`,
379
+ object: 'subscription',
380
+ status: 'canceled',
381
+ canceled_at: Math.floor(canceledAt.getTime() / 1000),
382
+ cancel_at_period_end: true,
383
+ current_period_end: Math.floor(periodEnd.getTime() / 1000),
384
+ ended_at: null,
385
+ cancellation_details: {
386
+ comment: null,
387
+ feedback: null,
388
+ reason: 'cancellation_requested',
389
+ },
390
+ },
391
+ };
392
+ }
393
+ // ---------------------------------------------------------------------------
394
+ // Public API - Usage tracking
395
+ // ---------------------------------------------------------------------------
396
+ /**
397
+ * Record a usage event for a team.
398
+ *
399
+ * Validates numeric inputs and returns a confirmation receipt with the
400
+ * generated record ID.
401
+ */
402
+ export async function recordUsage(request) {
403
+ const { teamId, userId, operationType, tokensUsed, costUsd } = request;
404
+ if (!teamId || !operationType) {
405
+ throw new Error('Team ID and operation type are required');
406
+ }
407
+ if (!Number.isFinite(tokensUsed) || tokensUsed < 0) {
408
+ throw new Error('tokensUsed must be a non-negative number');
409
+ }
410
+ if (!Number.isFinite(costUsd) || costUsd < 0) {
411
+ throw new Error('costUsd must be a non-negative number');
412
+ }
413
+ const id = crypto.randomUUID();
414
+ // stateRecordUsage(id, type, quantity, unit, costUsd, teamId, userId, metadata?)
415
+ stateRecordUsage(id, operationType, tokensUsed, 'tokens', costUsd, teamId, userId);
416
+ return {
417
+ recorded: true,
418
+ id,
419
+ timestamp: new Date().toISOString(),
420
+ teamId,
421
+ operationType,
422
+ tokensUsed,
423
+ costUsd,
424
+ };
425
+ }
426
+ /**
427
+ * Get a usage summary for a team over a given period.
428
+ *
429
+ * Returns an enhanced summary with daily breakdown, quota status relative to
430
+ * the team's current plan, and rate limit metadata.
431
+ */
432
+ export async function getUsage(teamId, period = 'month') {
433
+ const now = new Date();
434
+ let since;
435
+ switch (period) {
436
+ case 'day':
437
+ since = new Date(now.getTime() - 24 * 60 * 60 * 1000);
438
+ break;
439
+ case 'week':
440
+ since = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
441
+ break;
442
+ case 'month':
443
+ default:
444
+ since = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
445
+ break;
446
+ }
447
+ // The unified billing state module provides getUsageSummary() aggregated by
448
+ // type, and getUsage() for raw records. We use getUsageSummary() for
449
+ // byOperationType totals and getUsage() for per-user and daily breakdowns.
450
+ const summaryRows = stateGetUsageSummary(teamId, since, now);
451
+ const rawRecords = stateGetUsage(teamId, since, now, 10000, 0);
452
+ // Aggregate totals and byOperationType from summary rows
453
+ let totalOperations = 0;
454
+ let totalTokens = 0;
455
+ let totalCost = 0;
456
+ const byOperationType = {};
457
+ for (const row of summaryRows) {
458
+ totalOperations += row.count;
459
+ totalTokens += row.totalQuantity;
460
+ totalCost += row.totalCost;
461
+ byOperationType[row.type] = {
462
+ count: row.count,
463
+ tokensUsed: row.totalQuantity,
464
+ costUsd: row.totalCost,
465
+ };
466
+ }
467
+ // Aggregate byUser from raw records
468
+ const byUser = {};
469
+ for (const rec of rawRecords) {
470
+ if (rec.userId) {
471
+ const existing = byUser[rec.userId] ?? { count: 0, tokensUsed: 0, costUsd: 0 };
472
+ byUser[rec.userId] = {
473
+ count: existing.count + 1,
474
+ tokensUsed: existing.tokensUsed + rec.quantity,
475
+ costUsd: existing.costUsd + (rec.costUsd ?? 0),
476
+ };
477
+ }
478
+ }
479
+ // Build daily breakdown from raw records (group by calendar date)
480
+ const dailyMap = {};
481
+ for (const rec of rawRecords) {
482
+ const date = rec.createdAt.slice(0, 10); // "YYYY-MM-DD"
483
+ const existing = dailyMap[date] ?? { operations: 0, tokensUsed: 0, costUsd: 0 };
484
+ dailyMap[date] = {
485
+ operations: existing.operations + 1,
486
+ tokensUsed: existing.tokensUsed + rec.quantity,
487
+ costUsd: existing.costUsd + (rec.costUsd ?? 0),
488
+ };
489
+ }
490
+ const dailyBreakdown = Object.entries(dailyMap)
491
+ .sort(([a], [b]) => a.localeCompare(b))
492
+ .map(([date, agg]) => ({ date, ...agg }));
493
+ // Resolve the team's current plan for quota calculation
494
+ const subscription = stateGetSubscription(teamId);
495
+ const plan = subscription?.plan || 'free';
496
+ return {
497
+ period: {
498
+ start: since.toISOString(),
499
+ end: now.toISOString(),
500
+ },
501
+ totals: {
502
+ operations: totalOperations,
503
+ tokensUsed: totalTokens,
504
+ costUsd: Math.round(totalCost * 100) / 100,
505
+ },
506
+ byOperationType,
507
+ byUser: Object.keys(byUser).length > 0 ? byUser : undefined,
508
+ dailyBreakdown,
509
+ quota: buildQuota(plan, totalTokens, totalOperations, totalCost),
510
+ rateLimit: buildRateLimit(plan),
511
+ };
512
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Enterprise module barrel re-exports.
3
+ *
4
+ * Provides a single import point for all embedded enterprise functionality:
5
+ * - Auth: device flow and token management (replaces auth-service)
6
+ * - Teams: team CRUD and member management (replaces team-service)
7
+ * - Billing: subscriptions and usage tracking (replaces billing-service)
8
+ * - Audit: audit logging and export (replaces audit-service)
9
+ *
10
+ * Usage:
11
+ * import { initiateDeviceFlow, createTeam, subscribe, createLog } from '../enterprise';
12
+ */
13
+ export * from './auth';
14
+ export * from './teams';
15
+ export * from './billing';
16
+ export * from './audit';