@build-astron-co/nimbus 0.2.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 (313) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +628 -0
  3. package/bin/nimbus +38 -0
  4. package/package.json +80 -0
  5. package/src/__tests__/app.test.ts +76 -0
  6. package/src/__tests__/audit.test.ts +877 -0
  7. package/src/__tests__/circuit-breaker.test.ts +116 -0
  8. package/src/__tests__/cli-run.test.ts +115 -0
  9. package/src/__tests__/context-manager.test.ts +502 -0
  10. package/src/__tests__/context.test.ts +242 -0
  11. package/src/__tests__/enterprise.test.ts +401 -0
  12. package/src/__tests__/generator.test.ts +433 -0
  13. package/src/__tests__/hooks.test.ts +582 -0
  14. package/src/__tests__/init.test.ts +436 -0
  15. package/src/__tests__/intent-parser.test.ts +229 -0
  16. package/src/__tests__/llm-router.test.ts +209 -0
  17. package/src/__tests__/lsp.test.ts +293 -0
  18. package/src/__tests__/modes.test.ts +336 -0
  19. package/src/__tests__/permissions.test.ts +338 -0
  20. package/src/__tests__/serve.test.ts +275 -0
  21. package/src/__tests__/sessions.test.ts +227 -0
  22. package/src/__tests__/sharing.test.ts +288 -0
  23. package/src/__tests__/snapshots.test.ts +581 -0
  24. package/src/__tests__/state-db.test.ts +334 -0
  25. package/src/__tests__/stream-with-tools.test.ts +732 -0
  26. package/src/__tests__/subagents.test.ts +176 -0
  27. package/src/__tests__/system-prompt.test.ts +169 -0
  28. package/src/__tests__/tool-converter.test.ts +256 -0
  29. package/src/__tests__/tool-schemas.test.ts +397 -0
  30. package/src/__tests__/tools.test.ts +143 -0
  31. package/src/__tests__/version.test.ts +49 -0
  32. package/src/agent/compaction-agent.ts +227 -0
  33. package/src/agent/context-manager.ts +435 -0
  34. package/src/agent/context.ts +427 -0
  35. package/src/agent/deploy-preview.ts +426 -0
  36. package/src/agent/index.ts +68 -0
  37. package/src/agent/loop.ts +717 -0
  38. package/src/agent/modes.ts +429 -0
  39. package/src/agent/permissions.ts +466 -0
  40. package/src/agent/subagents/base.ts +116 -0
  41. package/src/agent/subagents/cost.ts +51 -0
  42. package/src/agent/subagents/explore.ts +42 -0
  43. package/src/agent/subagents/general.ts +54 -0
  44. package/src/agent/subagents/index.ts +102 -0
  45. package/src/agent/subagents/infra.ts +59 -0
  46. package/src/agent/subagents/security.ts +69 -0
  47. package/src/agent/system-prompt.ts +436 -0
  48. package/src/app.ts +122 -0
  49. package/src/audit/activity-log.ts +290 -0
  50. package/src/audit/compliance-checker.ts +540 -0
  51. package/src/audit/cost-tracker.ts +318 -0
  52. package/src/audit/index.ts +23 -0
  53. package/src/audit/security-scanner.ts +596 -0
  54. package/src/auth/guard.ts +75 -0
  55. package/src/auth/index.ts +56 -0
  56. package/src/auth/oauth.ts +455 -0
  57. package/src/auth/providers.ts +470 -0
  58. package/src/auth/sso.ts +113 -0
  59. package/src/auth/store.ts +505 -0
  60. package/src/auth/types.ts +187 -0
  61. package/src/build.ts +141 -0
  62. package/src/cli/index.ts +16 -0
  63. package/src/cli/init.ts +854 -0
  64. package/src/cli/openapi-spec.ts +356 -0
  65. package/src/cli/run.ts +237 -0
  66. package/src/cli/serve-auth.ts +80 -0
  67. package/src/cli/serve.ts +462 -0
  68. package/src/cli/web.ts +67 -0
  69. package/src/cli.ts +1417 -0
  70. package/src/clients/core-engine-client.ts +227 -0
  71. package/src/clients/enterprise-client.ts +334 -0
  72. package/src/clients/generator-client.ts +351 -0
  73. package/src/clients/git-client.ts +627 -0
  74. package/src/clients/github-client.ts +410 -0
  75. package/src/clients/helm-client.ts +504 -0
  76. package/src/clients/index.ts +80 -0
  77. package/src/clients/k8s-client.ts +497 -0
  78. package/src/clients/llm-client.ts +161 -0
  79. package/src/clients/rest-client.ts +130 -0
  80. package/src/clients/service-discovery.ts +33 -0
  81. package/src/clients/terraform-client.ts +482 -0
  82. package/src/clients/tools-client.ts +1843 -0
  83. package/src/clients/ws-client.ts +115 -0
  84. package/src/commands/analyze/index.ts +352 -0
  85. package/src/commands/apply/helm.ts +473 -0
  86. package/src/commands/apply/index.ts +213 -0
  87. package/src/commands/apply/k8s.ts +454 -0
  88. package/src/commands/apply/terraform.ts +582 -0
  89. package/src/commands/ask.ts +167 -0
  90. package/src/commands/audit/index.ts +238 -0
  91. package/src/commands/auth-cloud.ts +294 -0
  92. package/src/commands/auth-list.ts +134 -0
  93. package/src/commands/auth-profile.ts +121 -0
  94. package/src/commands/auth-status.ts +141 -0
  95. package/src/commands/aws/ec2.ts +501 -0
  96. package/src/commands/aws/iam.ts +397 -0
  97. package/src/commands/aws/index.ts +133 -0
  98. package/src/commands/aws/lambda.ts +396 -0
  99. package/src/commands/aws/rds.ts +439 -0
  100. package/src/commands/aws/s3.ts +439 -0
  101. package/src/commands/aws/vpc.ts +393 -0
  102. package/src/commands/aws-discover.ts +649 -0
  103. package/src/commands/aws-terraform.ts +805 -0
  104. package/src/commands/azure/aks.ts +376 -0
  105. package/src/commands/azure/functions.ts +253 -0
  106. package/src/commands/azure/index.ts +116 -0
  107. package/src/commands/azure/storage.ts +478 -0
  108. package/src/commands/azure/vm.ts +355 -0
  109. package/src/commands/billing/index.ts +256 -0
  110. package/src/commands/chat.ts +314 -0
  111. package/src/commands/config.ts +346 -0
  112. package/src/commands/cost/cloud-cost-estimator.ts +266 -0
  113. package/src/commands/cost/estimator.ts +79 -0
  114. package/src/commands/cost/index.ts +594 -0
  115. package/src/commands/cost/parsers/terraform.ts +273 -0
  116. package/src/commands/cost/parsers/types.ts +25 -0
  117. package/src/commands/cost/pricing/aws.ts +544 -0
  118. package/src/commands/cost/pricing/azure.ts +499 -0
  119. package/src/commands/cost/pricing/gcp.ts +396 -0
  120. package/src/commands/cost/pricing/index.ts +40 -0
  121. package/src/commands/demo.ts +250 -0
  122. package/src/commands/doctor.ts +794 -0
  123. package/src/commands/drift/index.ts +439 -0
  124. package/src/commands/explain.ts +277 -0
  125. package/src/commands/feedback.ts +389 -0
  126. package/src/commands/fix.ts +324 -0
  127. package/src/commands/fs/index.ts +402 -0
  128. package/src/commands/gcp/compute.ts +325 -0
  129. package/src/commands/gcp/functions.ts +271 -0
  130. package/src/commands/gcp/gke.ts +438 -0
  131. package/src/commands/gcp/iam.ts +344 -0
  132. package/src/commands/gcp/index.ts +129 -0
  133. package/src/commands/gcp/storage.ts +284 -0
  134. package/src/commands/generate-helm.ts +1249 -0
  135. package/src/commands/generate-k8s.ts +1560 -0
  136. package/src/commands/generate-terraform.ts +1460 -0
  137. package/src/commands/gh/index.ts +863 -0
  138. package/src/commands/git/index.ts +1343 -0
  139. package/src/commands/helm/index.ts +1126 -0
  140. package/src/commands/help.ts +539 -0
  141. package/src/commands/history.ts +142 -0
  142. package/src/commands/import.ts +868 -0
  143. package/src/commands/index.ts +367 -0
  144. package/src/commands/init.ts +1046 -0
  145. package/src/commands/k8s/index.ts +1137 -0
  146. package/src/commands/login.ts +631 -0
  147. package/src/commands/logout.ts +83 -0
  148. package/src/commands/onboarding.ts +228 -0
  149. package/src/commands/plan/display.ts +279 -0
  150. package/src/commands/plan/index.ts +599 -0
  151. package/src/commands/preview.ts +452 -0
  152. package/src/commands/questionnaire.ts +1270 -0
  153. package/src/commands/resume.ts +55 -0
  154. package/src/commands/team/index.ts +346 -0
  155. package/src/commands/template.ts +232 -0
  156. package/src/commands/tf/index.ts +1034 -0
  157. package/src/commands/upgrade.ts +550 -0
  158. package/src/commands/usage/index.ts +134 -0
  159. package/src/commands/version.ts +170 -0
  160. package/src/compat/index.ts +2 -0
  161. package/src/compat/runtime.ts +12 -0
  162. package/src/compat/sqlite.ts +107 -0
  163. package/src/config/index.ts +17 -0
  164. package/src/config/manager.ts +530 -0
  165. package/src/config/safety-policy.ts +358 -0
  166. package/src/config/schema.ts +125 -0
  167. package/src/config/types.ts +527 -0
  168. package/src/context/context-db.ts +199 -0
  169. package/src/demo/index.ts +349 -0
  170. package/src/demo/scenarios/full-journey.ts +229 -0
  171. package/src/demo/scenarios/getting-started.ts +127 -0
  172. package/src/demo/scenarios/helm-release.ts +341 -0
  173. package/src/demo/scenarios/k8s-deployment.ts +194 -0
  174. package/src/demo/scenarios/terraform-vpc.ts +170 -0
  175. package/src/demo/types.ts +92 -0
  176. package/src/engine/cost-estimator.ts +438 -0
  177. package/src/engine/diagram-generator.ts +256 -0
  178. package/src/engine/drift-detector.ts +902 -0
  179. package/src/engine/executor.ts +1035 -0
  180. package/src/engine/index.ts +76 -0
  181. package/src/engine/orchestrator.ts +636 -0
  182. package/src/engine/planner.ts +720 -0
  183. package/src/engine/safety.ts +743 -0
  184. package/src/engine/verifier.ts +770 -0
  185. package/src/enterprise/audit.ts +348 -0
  186. package/src/enterprise/auth.ts +270 -0
  187. package/src/enterprise/billing.ts +822 -0
  188. package/src/enterprise/index.ts +17 -0
  189. package/src/enterprise/teams.ts +443 -0
  190. package/src/generator/best-practices.ts +1608 -0
  191. package/src/generator/helm.ts +630 -0
  192. package/src/generator/index.ts +37 -0
  193. package/src/generator/intent-parser.ts +514 -0
  194. package/src/generator/kubernetes.ts +976 -0
  195. package/src/generator/terraform.ts +1867 -0
  196. package/src/history/index.ts +8 -0
  197. package/src/history/manager.ts +322 -0
  198. package/src/history/types.ts +34 -0
  199. package/src/hooks/config.ts +432 -0
  200. package/src/hooks/engine.ts +391 -0
  201. package/src/hooks/index.ts +4 -0
  202. package/src/llm/auth-bridge.ts +198 -0
  203. package/src/llm/circuit-breaker.ts +140 -0
  204. package/src/llm/config-loader.ts +201 -0
  205. package/src/llm/cost-calculator.ts +171 -0
  206. package/src/llm/index.ts +8 -0
  207. package/src/llm/model-aliases.ts +115 -0
  208. package/src/llm/provider-registry.ts +63 -0
  209. package/src/llm/providers/anthropic.ts +433 -0
  210. package/src/llm/providers/bedrock.ts +477 -0
  211. package/src/llm/providers/google.ts +405 -0
  212. package/src/llm/providers/ollama.ts +767 -0
  213. package/src/llm/providers/openai-compatible.ts +340 -0
  214. package/src/llm/providers/openai.ts +328 -0
  215. package/src/llm/providers/openrouter.ts +338 -0
  216. package/src/llm/router.ts +1035 -0
  217. package/src/llm/types.ts +232 -0
  218. package/src/lsp/client.ts +298 -0
  219. package/src/lsp/languages.ts +116 -0
  220. package/src/lsp/manager.ts +278 -0
  221. package/src/mcp/client.ts +402 -0
  222. package/src/mcp/index.ts +5 -0
  223. package/src/mcp/manager.ts +133 -0
  224. package/src/nimbus.ts +214 -0
  225. package/src/plugins/index.ts +27 -0
  226. package/src/plugins/loader.ts +334 -0
  227. package/src/plugins/manager.ts +376 -0
  228. package/src/plugins/types.ts +284 -0
  229. package/src/scanners/cicd-scanner.ts +258 -0
  230. package/src/scanners/cloud-scanner.ts +466 -0
  231. package/src/scanners/framework-scanner.ts +469 -0
  232. package/src/scanners/iac-scanner.ts +388 -0
  233. package/src/scanners/index.ts +539 -0
  234. package/src/scanners/language-scanner.ts +276 -0
  235. package/src/scanners/package-manager-scanner.ts +277 -0
  236. package/src/scanners/types.ts +172 -0
  237. package/src/sessions/manager.ts +365 -0
  238. package/src/sessions/types.ts +44 -0
  239. package/src/sharing/sync.ts +296 -0
  240. package/src/sharing/viewer.ts +97 -0
  241. package/src/snapshots/index.ts +2 -0
  242. package/src/snapshots/manager.ts +530 -0
  243. package/src/state/artifacts.ts +147 -0
  244. package/src/state/audit.ts +137 -0
  245. package/src/state/billing.ts +240 -0
  246. package/src/state/checkpoints.ts +117 -0
  247. package/src/state/config.ts +67 -0
  248. package/src/state/conversations.ts +14 -0
  249. package/src/state/credentials.ts +154 -0
  250. package/src/state/db.ts +58 -0
  251. package/src/state/index.ts +26 -0
  252. package/src/state/messages.ts +115 -0
  253. package/src/state/projects.ts +123 -0
  254. package/src/state/schema.ts +236 -0
  255. package/src/state/sessions.ts +147 -0
  256. package/src/state/teams.ts +200 -0
  257. package/src/telemetry.ts +108 -0
  258. package/src/tools/aws-ops.ts +952 -0
  259. package/src/tools/azure-ops.ts +579 -0
  260. package/src/tools/file-ops.ts +593 -0
  261. package/src/tools/gcp-ops.ts +625 -0
  262. package/src/tools/git-ops.ts +773 -0
  263. package/src/tools/github-ops.ts +799 -0
  264. package/src/tools/helm-ops.ts +943 -0
  265. package/src/tools/index.ts +17 -0
  266. package/src/tools/k8s-ops.ts +819 -0
  267. package/src/tools/schemas/converter.ts +184 -0
  268. package/src/tools/schemas/devops.ts +612 -0
  269. package/src/tools/schemas/index.ts +73 -0
  270. package/src/tools/schemas/standard.ts +1144 -0
  271. package/src/tools/schemas/types.ts +705 -0
  272. package/src/tools/terraform-ops.ts +862 -0
  273. package/src/types/ambient.d.ts +193 -0
  274. package/src/types/config.ts +83 -0
  275. package/src/types/drift.ts +116 -0
  276. package/src/types/enterprise.ts +335 -0
  277. package/src/types/index.ts +20 -0
  278. package/src/types/plan.ts +44 -0
  279. package/src/types/request.ts +65 -0
  280. package/src/types/response.ts +54 -0
  281. package/src/types/service.ts +51 -0
  282. package/src/ui/App.tsx +997 -0
  283. package/src/ui/DeployPreview.tsx +169 -0
  284. package/src/ui/Header.tsx +68 -0
  285. package/src/ui/InputBox.tsx +350 -0
  286. package/src/ui/MessageList.tsx +585 -0
  287. package/src/ui/PermissionPrompt.tsx +151 -0
  288. package/src/ui/StatusBar.tsx +158 -0
  289. package/src/ui/ToolCallDisplay.tsx +409 -0
  290. package/src/ui/chat-ui.ts +853 -0
  291. package/src/ui/index.ts +33 -0
  292. package/src/ui/ink/index.ts +711 -0
  293. package/src/ui/streaming.ts +176 -0
  294. package/src/ui/types.ts +57 -0
  295. package/src/utils/analytics.ts +72 -0
  296. package/src/utils/cost-warning.ts +27 -0
  297. package/src/utils/env.ts +46 -0
  298. package/src/utils/errors.ts +69 -0
  299. package/src/utils/event-bus.ts +38 -0
  300. package/src/utils/index.ts +24 -0
  301. package/src/utils/logger.ts +171 -0
  302. package/src/utils/rate-limiter.ts +121 -0
  303. package/src/utils/service-auth.ts +49 -0
  304. package/src/utils/validation.ts +53 -0
  305. package/src/version.ts +4 -0
  306. package/src/watcher/index.ts +163 -0
  307. package/src/wizard/approval.ts +383 -0
  308. package/src/wizard/index.ts +25 -0
  309. package/src/wizard/prompts.ts +338 -0
  310. package/src/wizard/types.ts +171 -0
  311. package/src/wizard/ui.ts +556 -0
  312. package/src/wizard/wizard.ts +304 -0
  313. package/tsconfig.json +24 -0
@@ -0,0 +1,527 @@
1
+ /**
2
+ * Configuration Types
3
+ *
4
+ * Type definitions for Nimbus CLI configuration
5
+ */
6
+
7
+ /**
8
+ * Workspace configuration for a project
9
+ */
10
+ export interface WorkspaceConfig {
11
+ /** Default cloud provider (aws, gcp, azure) */
12
+ defaultProvider?: string;
13
+ /** Output directory for generated code */
14
+ outputDirectory?: string;
15
+ /** Project name */
16
+ name?: string;
17
+ }
18
+
19
+ /**
20
+ * Cost optimization routing configuration
21
+ */
22
+ export interface CostOptimizationConfig {
23
+ /** Enable LLM cost optimization routing */
24
+ enabled?: boolean;
25
+ /** Model for simple tasks (summaries, classification) */
26
+ cheap_model?: string;
27
+ /** Model for complex tasks (code generation, reasoning) */
28
+ expensive_model?: string;
29
+ /** Task categories that should use the cheap model */
30
+ use_cheap_model_for?: string[];
31
+ /** Task categories that should use the expensive model */
32
+ use_expensive_model_for?: string[];
33
+ }
34
+
35
+ /**
36
+ * Per-provider LLM configuration (A3/A4)
37
+ */
38
+ export interface ProviderConfig {
39
+ /** API key for this provider */
40
+ api_key?: string;
41
+ /** Base URL for custom API endpoints (e.g., self-hosted or proxy) */
42
+ base_url?: string;
43
+ /** Available models for this provider */
44
+ models?: string[];
45
+ }
46
+
47
+ /**
48
+ * LLM fallback configuration (A7/A8)
49
+ */
50
+ export interface FallbackConfig {
51
+ /** Enable fallback to alternative providers on failure */
52
+ enabled?: boolean;
53
+ /** Ordered list of provider names to try on failure */
54
+ providers?: string[];
55
+ }
56
+
57
+ /**
58
+ * LLM-related configuration
59
+ */
60
+ export interface LLMConfig {
61
+ /** Default model to use */
62
+ defaultModel?: string;
63
+ /** Default LLM provider name (A2) */
64
+ default_provider?: string;
65
+ /** Temperature for generation (0-1) */
66
+ temperature?: number;
67
+ /** Maximum tokens for response */
68
+ maxTokens?: number;
69
+ /** Cost optimization settings */
70
+ cost_optimization?: CostOptimizationConfig;
71
+ /** Per-provider configuration map (A3/A4) */
72
+ providers?: Record<string, ProviderConfig>;
73
+ /** Fallback provider configuration (A7/A8) */
74
+ fallback?: FallbackConfig;
75
+ }
76
+
77
+ /**
78
+ * History configuration
79
+ */
80
+ export interface HistoryConfig {
81
+ /** Maximum number of entries to keep */
82
+ maxEntries?: number;
83
+ /** Whether to save history */
84
+ enabled?: boolean;
85
+ }
86
+
87
+ /**
88
+ * Auto-approve settings per operation type
89
+ */
90
+ export interface AutoApproveConfig {
91
+ /** Auto-approve read operations (list, get, describe) */
92
+ read?: boolean;
93
+ /** Auto-approve generate operations (IaC generation) */
94
+ generate?: boolean;
95
+ /** Auto-approve create operations (apply, install) */
96
+ create?: boolean;
97
+ /** Auto-approve update operations (upgrade, scale) */
98
+ update?: boolean;
99
+ /** Auto-approve delete operations (delete, destroy, uninstall) */
100
+ delete?: boolean;
101
+ }
102
+
103
+ /**
104
+ * Safety configuration
105
+ */
106
+ export interface SafetyConfig {
107
+ /** Require confirmation for destructive operations */
108
+ requireConfirmation?: boolean;
109
+ /** Enable dry-run by default */
110
+ dryRunByDefault?: boolean;
111
+ /** Auto-approve settings per operation type */
112
+ auto_approve?: AutoApproveConfig;
113
+ }
114
+
115
+ /**
116
+ * UI configuration
117
+ */
118
+ export interface UIConfig {
119
+ /** Color theme */
120
+ theme?: 'dark' | 'light' | 'auto';
121
+ /** Enable colors in output */
122
+ colors?: boolean;
123
+ /** Spinner style */
124
+ spinner?: 'dots' | 'line' | 'simple';
125
+ }
126
+
127
+ /**
128
+ * Persona configuration for chat behavior
129
+ */
130
+ export interface PersonaConfig {
131
+ /** Persona mode (standard, concise, detailed, expert, custom) */
132
+ mode?: 'professional' | 'assistant' | 'expert' | 'standard' | 'concise' | 'detailed' | 'custom';
133
+ /** Verbosity level (minimal, normal, verbose, detailed) */
134
+ verbosity?: 'minimal' | 'normal' | 'verbose' | 'detailed';
135
+ /** Custom persona prompt override */
136
+ custom?: string;
137
+ }
138
+
139
+ /**
140
+ * Cloud provider-specific configuration
141
+ */
142
+ export interface CloudProviderConfig {
143
+ /** Default region for the provider */
144
+ default_region?: string;
145
+ /** Default AWS profile */
146
+ default_profile?: string;
147
+ /** Default GCP project */
148
+ default_project?: string;
149
+ /** Default Azure subscription */
150
+ default_subscription?: string;
151
+ }
152
+
153
+ /**
154
+ * Cloud configuration across providers
155
+ */
156
+ export interface CloudConfig {
157
+ /** Default cloud provider */
158
+ default_provider?: 'aws' | 'gcp' | 'azure';
159
+ /** AWS-specific settings */
160
+ aws?: CloudProviderConfig;
161
+ /** GCP-specific settings */
162
+ gcp?: CloudProviderConfig;
163
+ /** Azure-specific settings */
164
+ azure?: CloudProviderConfig;
165
+ }
166
+
167
+ /**
168
+ * Terraform defaults
169
+ */
170
+ export interface TerraformDefaults {
171
+ /** Default backend type */
172
+ default_backend?: 's3' | 'gcs' | 'azurerm' | 'local';
173
+ /** State bucket name */
174
+ state_bucket?: string;
175
+ /** DynamoDB lock table (AWS) */
176
+ lock_table?: string;
177
+ }
178
+
179
+ /**
180
+ * Kubernetes defaults
181
+ */
182
+ export interface KubernetesDefaults {
183
+ /** Default kubectl context */
184
+ default_context?: string;
185
+ /** Default namespace */
186
+ default_namespace?: string;
187
+ }
188
+
189
+ /**
190
+ * Complete Nimbus configuration schema
191
+ * Stored at ~/.nimbus/config.yaml
192
+ */
193
+ export interface NimbusConfig {
194
+ /** Config version for migrations */
195
+ version: number;
196
+ /** Enable anonymous telemetry/usage statistics (A1) */
197
+ telemetry?: boolean;
198
+ /** Workspace settings */
199
+ workspace?: WorkspaceConfig;
200
+ /** LLM settings */
201
+ llm?: LLMConfig;
202
+ /** History settings */
203
+ history?: HistoryConfig;
204
+ /** Safety settings */
205
+ safety?: SafetyConfig;
206
+ /** UI settings */
207
+ ui?: UIConfig;
208
+ /** Persona settings */
209
+ persona?: PersonaConfig;
210
+ /** Cloud provider settings */
211
+ cloud?: CloudConfig;
212
+ /** Terraform defaults */
213
+ terraform?: TerraformDefaults;
214
+ /** Kubernetes defaults */
215
+ kubernetes?: KubernetesDefaults;
216
+ }
217
+
218
+ /**
219
+ * Flat key-value representation of config
220
+ * Used for set/get operations like: llm.defaultModel
221
+ */
222
+ export type ConfigKey =
223
+ | 'telemetry'
224
+ | 'workspace.defaultProvider'
225
+ | 'workspace.outputDirectory'
226
+ | 'workspace.name'
227
+ | 'llm.defaultModel'
228
+ | 'llm.default_provider'
229
+ | 'llm.temperature'
230
+ | 'llm.maxTokens'
231
+ | 'llm.fallback.enabled'
232
+ | 'llm.fallback.providers'
233
+ | 'history.maxEntries'
234
+ | 'history.enabled'
235
+ | 'safety.requireConfirmation'
236
+ | 'safety.dryRunByDefault'
237
+ | 'safety.auto_approve.read'
238
+ | 'safety.auto_approve.generate'
239
+ | 'safety.auto_approve.create'
240
+ | 'safety.auto_approve.update'
241
+ | 'safety.auto_approve.delete'
242
+ | 'ui.theme'
243
+ | 'ui.colors'
244
+ | 'ui.spinner'
245
+ | 'persona.mode'
246
+ | 'persona.verbosity'
247
+ | 'persona.custom'
248
+ | 'cloud.default_provider'
249
+ | 'cloud.aws.default_region'
250
+ | 'cloud.aws.default_profile'
251
+ | 'cloud.gcp.default_region'
252
+ | 'cloud.gcp.default_project'
253
+ | 'cloud.azure.default_region'
254
+ | 'cloud.azure.default_subscription'
255
+ | 'terraform.default_backend'
256
+ | 'terraform.state_bucket'
257
+ | 'terraform.lock_table'
258
+ | 'kubernetes.default_context'
259
+ | 'kubernetes.default_namespace'
260
+ | 'llm.cost_optimization.enabled'
261
+ | 'llm.cost_optimization.cheap_model'
262
+ | 'llm.cost_optimization.expensive_model'
263
+ | 'llm.cost_optimization.use_cheap_model_for'
264
+ | 'llm.cost_optimization.use_expensive_model_for';
265
+
266
+ /**
267
+ * Config key metadata for help/validation
268
+ */
269
+ export interface ConfigKeyInfo {
270
+ key: ConfigKey;
271
+ description: string;
272
+ type: 'string' | 'number' | 'boolean';
273
+ defaultValue?: string | number | boolean;
274
+ }
275
+
276
+ /**
277
+ * Registry of all config keys
278
+ */
279
+ export const CONFIG_KEYS: ConfigKeyInfo[] = [
280
+ {
281
+ key: 'workspace.defaultProvider',
282
+ description: 'Default cloud provider (aws, gcp, azure)',
283
+ type: 'string',
284
+ defaultValue: 'aws',
285
+ },
286
+ {
287
+ key: 'workspace.outputDirectory',
288
+ description: 'Output directory for generated code',
289
+ type: 'string',
290
+ defaultValue: './infrastructure',
291
+ },
292
+ {
293
+ key: 'workspace.name',
294
+ description: 'Project name',
295
+ type: 'string',
296
+ },
297
+ {
298
+ key: 'llm.defaultModel',
299
+ description: 'Default LLM model to use',
300
+ type: 'string',
301
+ },
302
+ {
303
+ key: 'llm.temperature',
304
+ description: 'Temperature for LLM generation (0-1)',
305
+ type: 'number',
306
+ defaultValue: 0.7,
307
+ },
308
+ {
309
+ key: 'llm.maxTokens',
310
+ description: 'Maximum tokens for LLM response',
311
+ type: 'number',
312
+ defaultValue: 4096,
313
+ },
314
+ {
315
+ key: 'history.maxEntries',
316
+ description: 'Maximum history entries to keep',
317
+ type: 'number',
318
+ defaultValue: 100,
319
+ },
320
+ {
321
+ key: 'history.enabled',
322
+ description: 'Enable command history',
323
+ type: 'boolean',
324
+ defaultValue: true,
325
+ },
326
+ {
327
+ key: 'safety.requireConfirmation',
328
+ description: 'Require confirmation for destructive operations',
329
+ type: 'boolean',
330
+ defaultValue: true,
331
+ },
332
+ {
333
+ key: 'safety.dryRunByDefault',
334
+ description: 'Enable dry-run mode by default',
335
+ type: 'boolean',
336
+ defaultValue: false,
337
+ },
338
+ {
339
+ key: 'safety.auto_approve.read',
340
+ description: 'Auto-approve read operations (list, get, describe)',
341
+ type: 'boolean',
342
+ defaultValue: true,
343
+ },
344
+ {
345
+ key: 'safety.auto_approve.generate',
346
+ description: 'Auto-approve generate operations (IaC generation)',
347
+ type: 'boolean',
348
+ defaultValue: true,
349
+ },
350
+ {
351
+ key: 'safety.auto_approve.create',
352
+ description: 'Auto-approve create operations (apply, install)',
353
+ type: 'boolean',
354
+ defaultValue: false,
355
+ },
356
+ {
357
+ key: 'safety.auto_approve.update',
358
+ description: 'Auto-approve update operations (upgrade, scale)',
359
+ type: 'boolean',
360
+ defaultValue: false,
361
+ },
362
+ {
363
+ key: 'safety.auto_approve.delete',
364
+ description: 'Auto-approve delete operations (delete, destroy, uninstall)',
365
+ type: 'boolean',
366
+ defaultValue: false,
367
+ },
368
+ {
369
+ key: 'ui.theme',
370
+ description: 'Color theme (dark, light, auto)',
371
+ type: 'string',
372
+ defaultValue: 'auto',
373
+ },
374
+ {
375
+ key: 'ui.colors',
376
+ description: 'Enable colors in output',
377
+ type: 'boolean',
378
+ defaultValue: true,
379
+ },
380
+ {
381
+ key: 'ui.spinner',
382
+ description: 'Spinner style (dots, line, simple)',
383
+ type: 'string',
384
+ defaultValue: 'dots',
385
+ },
386
+ {
387
+ key: 'persona.mode',
388
+ description: 'AI persona mode (standard, concise, detailed, expert)',
389
+ type: 'string',
390
+ defaultValue: 'standard',
391
+ },
392
+ {
393
+ key: 'persona.verbosity',
394
+ description: 'Response verbosity level (minimal, normal, verbose)',
395
+ type: 'string',
396
+ defaultValue: 'normal',
397
+ },
398
+ {
399
+ key: 'persona.custom',
400
+ description: 'Custom persona prompt override',
401
+ type: 'string',
402
+ defaultValue: '',
403
+ },
404
+ {
405
+ key: 'cloud.default_provider',
406
+ description: 'Default cloud provider (aws, gcp, azure)',
407
+ type: 'string',
408
+ defaultValue: 'aws',
409
+ },
410
+ {
411
+ key: 'cloud.aws.default_region',
412
+ description: 'Default AWS region',
413
+ type: 'string',
414
+ defaultValue: 'us-east-1',
415
+ },
416
+ {
417
+ key: 'cloud.aws.default_profile',
418
+ description: 'Default AWS CLI profile',
419
+ type: 'string',
420
+ defaultValue: 'default',
421
+ },
422
+ {
423
+ key: 'cloud.gcp.default_region',
424
+ description: 'Default GCP region',
425
+ type: 'string',
426
+ defaultValue: 'us-central1',
427
+ },
428
+ {
429
+ key: 'cloud.gcp.default_project',
430
+ description: 'Default GCP project ID',
431
+ type: 'string',
432
+ },
433
+ {
434
+ key: 'cloud.azure.default_region',
435
+ description: 'Default Azure region',
436
+ type: 'string',
437
+ defaultValue: 'eastus',
438
+ },
439
+ {
440
+ key: 'cloud.azure.default_subscription',
441
+ description: 'Default Azure subscription ID',
442
+ type: 'string',
443
+ },
444
+ {
445
+ key: 'terraform.default_backend',
446
+ description: 'Default Terraform backend (s3, gcs, azurerm, local)',
447
+ type: 'string',
448
+ defaultValue: 's3',
449
+ },
450
+ {
451
+ key: 'terraform.state_bucket',
452
+ description: 'Terraform state bucket name',
453
+ type: 'string',
454
+ },
455
+ {
456
+ key: 'terraform.lock_table',
457
+ description: 'Terraform DynamoDB lock table name',
458
+ type: 'string',
459
+ },
460
+ {
461
+ key: 'kubernetes.default_context',
462
+ description: 'Default kubectl context',
463
+ type: 'string',
464
+ },
465
+ {
466
+ key: 'kubernetes.default_namespace',
467
+ description: 'Default Kubernetes namespace',
468
+ type: 'string',
469
+ defaultValue: 'default',
470
+ },
471
+ {
472
+ key: 'llm.cost_optimization.enabled',
473
+ description: 'Enable LLM cost optimization routing',
474
+ type: 'boolean',
475
+ defaultValue: false,
476
+ },
477
+ {
478
+ key: 'llm.cost_optimization.cheap_model',
479
+ description: 'Model for simple tasks (summaries, classification)',
480
+ type: 'string',
481
+ defaultValue: 'claude-haiku-4-20250514',
482
+ },
483
+ {
484
+ key: 'llm.cost_optimization.expensive_model',
485
+ description: 'Model for complex tasks (code generation, reasoning)',
486
+ type: 'string',
487
+ defaultValue: 'claude-sonnet-4-20250514',
488
+ },
489
+ // A1: Telemetry
490
+ {
491
+ key: 'telemetry',
492
+ description: 'Enable anonymous usage statistics and error reporting',
493
+ type: 'boolean',
494
+ defaultValue: true,
495
+ },
496
+ // A2: LLM default provider
497
+ {
498
+ key: 'llm.default_provider',
499
+ description: 'Default LLM provider to use (e.g. anthropic, openai, google)',
500
+ type: 'string',
501
+ },
502
+ // A5: Cost optimization — cheap model task routing
503
+ {
504
+ key: 'llm.cost_optimization.use_cheap_model_for',
505
+ description: 'Task categories that should be routed to the cheap model (JSON array)',
506
+ type: 'string',
507
+ },
508
+ // A6: Cost optimization — expensive model task routing
509
+ {
510
+ key: 'llm.cost_optimization.use_expensive_model_for',
511
+ description: 'Task categories that should be routed to the expensive model (JSON array)',
512
+ type: 'string',
513
+ },
514
+ // A7: Fallback enabled
515
+ {
516
+ key: 'llm.fallback.enabled',
517
+ description: 'Enable automatic fallback to alternative LLM providers on failure',
518
+ type: 'boolean',
519
+ defaultValue: false,
520
+ },
521
+ // A8: Fallback provider list
522
+ {
523
+ key: 'llm.fallback.providers',
524
+ description: 'Ordered list of fallback LLM providers to try on failure (JSON array)',
525
+ type: 'string',
526
+ },
527
+ ];
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Context Database
3
+ *
4
+ * Lightweight SQLite wrapper for .nimbus/context.db that stores:
5
+ * - Recent commands and their results
6
+ * - File change tracking for project context
7
+ * - AI conversation context across sessions
8
+ */
9
+
10
+ import { Database } from '../compat/sqlite';
11
+ import * as path from 'path';
12
+ import * as fs from 'fs';
13
+
14
+ const CONTEXT_DB_NAME = 'context.db';
15
+
16
+ const SCHEMA = `
17
+ CREATE TABLE IF NOT EXISTS command_history (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
20
+ command TEXT NOT NULL,
21
+ args TEXT,
22
+ status TEXT NOT NULL DEFAULT 'success',
23
+ duration_ms INTEGER,
24
+ output_summary TEXT
25
+ );
26
+
27
+ CREATE TABLE IF NOT EXISTS file_changes (
28
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
29
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
30
+ file_path TEXT NOT NULL,
31
+ change_type TEXT NOT NULL,
32
+ content_hash TEXT,
33
+ metadata TEXT
34
+ );
35
+
36
+ CREATE TABLE IF NOT EXISTS conversation_context (
37
+ id TEXT PRIMARY KEY,
38
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
39
+ title TEXT,
40
+ messages TEXT NOT NULL,
41
+ model TEXT,
42
+ token_count INTEGER,
43
+ metadata TEXT
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_cmd_history_ts ON command_history(timestamp);
47
+ CREATE INDEX IF NOT EXISTS idx_file_changes_path ON file_changes(file_path);
48
+ CREATE INDEX IF NOT EXISTS idx_file_changes_ts ON file_changes(timestamp);
49
+ CREATE INDEX IF NOT EXISTS idx_conversation_ts ON conversation_context(timestamp);
50
+ `;
51
+
52
+ export class ContextDatabase {
53
+ private db: Database;
54
+ private dbPath: string;
55
+
56
+ constructor(projectDir: string) {
57
+ const nimbusDir = path.join(projectDir, '.nimbus');
58
+ this.dbPath = path.join(nimbusDir, CONTEXT_DB_NAME);
59
+
60
+ if (!fs.existsSync(nimbusDir)) {
61
+ fs.mkdirSync(nimbusDir, { recursive: true });
62
+ }
63
+
64
+ this.db = new Database(this.dbPath);
65
+ this.db.exec(SCHEMA);
66
+ }
67
+
68
+ recordCommand(
69
+ command: string,
70
+ args?: string,
71
+ status: string = 'success',
72
+ durationMs?: number,
73
+ outputSummary?: string
74
+ ): void {
75
+ const stmt = this.db.prepare(`
76
+ INSERT INTO command_history (command, args, status, duration_ms, output_summary)
77
+ VALUES (?, ?, ?, ?, ?)
78
+ `);
79
+ stmt.run(command, args || null, status, durationMs || null, outputSummary || null);
80
+ }
81
+
82
+ getRecentCommands(limit: number = 20): Array<{
83
+ id: number;
84
+ timestamp: string;
85
+ command: string;
86
+ args: string | null;
87
+ status: string;
88
+ durationMs: number | null;
89
+ }> {
90
+ const stmt = this.db.prepare(`
91
+ SELECT * FROM command_history ORDER BY timestamp DESC LIMIT ?
92
+ `);
93
+ return (stmt.all(limit) as any[]).map(row => ({
94
+ id: row.id,
95
+ timestamp: row.timestamp,
96
+ command: row.command,
97
+ args: row.args,
98
+ status: row.status,
99
+ durationMs: row.duration_ms,
100
+ }));
101
+ }
102
+
103
+ trackFileChange(
104
+ filePath: string,
105
+ changeType: 'created' | 'modified' | 'deleted',
106
+ contentHash?: string,
107
+ metadata?: Record<string, unknown>
108
+ ): void {
109
+ const stmt = this.db.prepare(`
110
+ INSERT INTO file_changes (file_path, change_type, content_hash, metadata)
111
+ VALUES (?, ?, ?, ?)
112
+ `);
113
+ stmt.run(filePath, changeType, contentHash || null, metadata ? JSON.stringify(metadata) : null);
114
+ }
115
+
116
+ getRecentFileChanges(limit: number = 50): Array<{
117
+ filePath: string;
118
+ changeType: string;
119
+ timestamp: string;
120
+ }> {
121
+ const stmt = this.db.prepare(`
122
+ SELECT * FROM file_changes ORDER BY timestamp DESC LIMIT ?
123
+ `);
124
+ return (stmt.all(limit) as any[]).map(row => ({
125
+ filePath: row.file_path,
126
+ changeType: row.change_type,
127
+ timestamp: row.timestamp,
128
+ }));
129
+ }
130
+
131
+ saveConversation(
132
+ id: string,
133
+ title: string,
134
+ messages: unknown[],
135
+ model?: string,
136
+ tokenCount?: number,
137
+ metadata?: Record<string, unknown>
138
+ ): void {
139
+ const stmt = this.db.prepare(`
140
+ INSERT OR REPLACE INTO conversation_context (id, title, messages, model, token_count, metadata)
141
+ VALUES (?, ?, ?, ?, ?, ?)
142
+ `);
143
+ stmt.run(
144
+ id,
145
+ title,
146
+ JSON.stringify(messages),
147
+ model || null,
148
+ tokenCount || null,
149
+ metadata ? JSON.stringify(metadata) : null
150
+ );
151
+ }
152
+
153
+ getConversation(id: string): {
154
+ id: string;
155
+ title: string;
156
+ messages: unknown[];
157
+ model: string | null;
158
+ tokenCount: number | null;
159
+ } | null {
160
+ const stmt = this.db.prepare('SELECT * FROM conversation_context WHERE id = ?');
161
+ const row: any = stmt.get(id);
162
+ if (!row) {
163
+ return null;
164
+ }
165
+ return {
166
+ id: row.id,
167
+ title: row.title,
168
+ messages: JSON.parse(row.messages),
169
+ model: row.model,
170
+ tokenCount: row.token_count,
171
+ };
172
+ }
173
+
174
+ listConversations(
175
+ limit: number = 20
176
+ ): Array<{ id: string; title: string; timestamp: string; model: string | null }> {
177
+ const stmt = this.db.prepare(`
178
+ SELECT id, title, timestamp, model FROM conversation_context ORDER BY timestamp DESC LIMIT ?
179
+ `);
180
+ return (stmt.all(limit) as any[]).map(row => ({
181
+ id: row.id,
182
+ title: row.title,
183
+ timestamp: row.timestamp,
184
+ model: row.model,
185
+ }));
186
+ }
187
+
188
+ close(): void {
189
+ this.db.close();
190
+ }
191
+
192
+ getPath(): string {
193
+ return this.dbPath;
194
+ }
195
+ }
196
+
197
+ export function initContextDatabase(projectDir: string): ContextDatabase {
198
+ return new ContextDatabase(projectDir);
199
+ }