@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,170 @@
1
+ /**
2
+ * Version Command
3
+ *
4
+ * Display CLI and component version information
5
+ *
6
+ * Usage: nimbus version [options]
7
+ */
8
+
9
+ import { logger } from '../utils';
10
+ import { ui } from '../wizard';
11
+
12
+ /**
13
+ * Command options
14
+ */
15
+ export interface VersionOptions {
16
+ verbose?: boolean;
17
+ json?: boolean;
18
+ }
19
+
20
+ /**
21
+ * Version information structure
22
+ */
23
+ interface VersionInfo {
24
+ cli: string;
25
+ node: string;
26
+ bun?: string;
27
+ platform: string;
28
+ arch: string;
29
+ components?: Record<string, string>;
30
+ }
31
+
32
+ /**
33
+ * Get the CLI version from package.json or environment
34
+ */
35
+ function getCliVersion(): string {
36
+ // Try environment variable first (set during build)
37
+ if (process.env.NIMBUS_VERSION) {
38
+ return process.env.NIMBUS_VERSION;
39
+ }
40
+
41
+ // Try npm_package_version (available when run via npm/bun)
42
+ if (process.env.npm_package_version) {
43
+ return process.env.npm_package_version;
44
+ }
45
+
46
+ // Fallback to reading package.json
47
+ try {
48
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
49
+ const pkg = require('../../package.json');
50
+ return pkg.version || '0.1.0';
51
+ } catch {
52
+ return '0.1.0';
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Get Bun version if running under Bun
58
+ */
59
+ function getBunVersion(): string | undefined {
60
+ // Check for Bun global
61
+ const globalAny = globalThis as any;
62
+ if (typeof globalAny.Bun !== 'undefined') {
63
+ return globalAny.Bun.version;
64
+ }
65
+ return undefined;
66
+ }
67
+
68
+ /**
69
+ * Fetch component versions from services (for verbose mode)
70
+ */
71
+ async function fetchComponentVersions(): Promise<Record<string, string>> {
72
+ const components: Record<string, string> = {};
73
+ const services = [
74
+ { name: 'core-engine', url: process.env.CORE_ENGINE_URL || 'http://localhost:3001' },
75
+ { name: 'llm-service', url: process.env.LLM_SERVICE_URL || 'http://localhost:3002' },
76
+ {
77
+ name: 'generator-service',
78
+ url: process.env.GENERATOR_SERVICE_URL || 'http://localhost:3003',
79
+ },
80
+ { name: 'terraform-tools', url: process.env.TERRAFORM_TOOLS_URL || 'http://localhost:3006' },
81
+ { name: 'k8s-tools', url: process.env.K8S_TOOLS_URL || 'http://localhost:3007' },
82
+ { name: 'helm-tools', url: process.env.HELM_TOOLS_URL || 'http://localhost:3008' },
83
+ ];
84
+
85
+ const fetchWithTimeout = async (url: string, timeout = 2000): Promise<Response> => {
86
+ const controller = new AbortController();
87
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
88
+ try {
89
+ const response = await fetch(url, { signal: controller.signal });
90
+ clearTimeout(timeoutId);
91
+ return response;
92
+ } catch {
93
+ clearTimeout(timeoutId);
94
+ throw new Error('Timeout');
95
+ }
96
+ };
97
+
98
+ await Promise.all(
99
+ services.map(async service => {
100
+ try {
101
+ const response = await fetchWithTimeout(`${service.url}/health`);
102
+ if (response.ok) {
103
+ const data = (await response.json()) as { version?: string; status?: string };
104
+ components[service.name] = data.version || 'running';
105
+ } else {
106
+ components[service.name] = 'unavailable';
107
+ }
108
+ } catch {
109
+ components[service.name] = 'unavailable';
110
+ }
111
+ })
112
+ );
113
+
114
+ return components;
115
+ }
116
+
117
+ /**
118
+ * Run the version command
119
+ */
120
+ export async function versionCommand(options: VersionOptions = {}): Promise<void> {
121
+ logger.debug('Running version command', { options });
122
+
123
+ const versionInfo: VersionInfo = {
124
+ cli: getCliVersion(),
125
+ node: process.version,
126
+ bun: getBunVersion(),
127
+ platform: process.platform,
128
+ arch: process.arch,
129
+ };
130
+
131
+ // Fetch component versions in verbose mode
132
+ if (options.verbose) {
133
+ ui.startSpinner({ message: 'Fetching component versions...' });
134
+ versionInfo.components = await fetchComponentVersions();
135
+ ui.stopSpinnerSuccess('');
136
+ }
137
+
138
+ // JSON output
139
+ if (options.json) {
140
+ console.log(JSON.stringify(versionInfo, null, 2));
141
+ return;
142
+ }
143
+
144
+ // Human-readable output
145
+ ui.print(`nimbus version ${versionInfo.cli}`);
146
+
147
+ if (options.verbose) {
148
+ ui.newLine();
149
+ ui.print(`Runtime:`);
150
+ if (versionInfo.bun) {
151
+ ui.print(` Bun: ${versionInfo.bun}`);
152
+ }
153
+ ui.print(` Node: ${versionInfo.node}`);
154
+ ui.print(` Platform: ${versionInfo.platform}`);
155
+ ui.print(` Arch: ${versionInfo.arch}`);
156
+
157
+ if (versionInfo.components) {
158
+ ui.newLine();
159
+ ui.print(`Components:`);
160
+ for (const [name, version] of Object.entries(versionInfo.components)) {
161
+ const status =
162
+ version === 'unavailable' ? ui.color(version, 'red') : ui.color(version, 'green');
163
+ ui.print(` ${name.padEnd(18)} ${status}`);
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ // Export as default command
170
+ export default versionCommand;
@@ -0,0 +1,2 @@
1
+ export { isBun, isNode } from './runtime';
2
+ export { Database } from './sqlite';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Runtime Compatibility Layer
3
+ *
4
+ * Detects whether we're running under Bun or Node.js and provides
5
+ * compatibility shims for Bun-specific APIs when running under Node.
6
+ */
7
+
8
+ /** Whether the current runtime is Bun. */
9
+ export const isBun = typeof globalThis.Bun !== 'undefined';
10
+
11
+ /** Whether the current runtime is Node.js (without Bun). */
12
+ export const isNode = !isBun && typeof process !== 'undefined' && !!process.versions?.node;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * SQLite Compatibility Layer
3
+ *
4
+ * Uses bun:sqlite when running under Bun, falls back to better-sqlite3
5
+ * under Node.js. Both libraries have nearly identical APIs.
6
+ *
7
+ * Exports:
8
+ * - `Database` (value) -- the constructor, usable as `new Database(path)`
9
+ * - `Database` (type) -- the instance interface, usable as `db: Database`
10
+ *
11
+ * This dual export mirrors how a native `class` declaration works in
12
+ * TypeScript: the same identifier serves as both a value and a type.
13
+ */
14
+
15
+ import { isBun } from './runtime';
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Type definitions
19
+ // ---------------------------------------------------------------------------
20
+
21
+ /** Prepared statement returned by Database.prepare(). */
22
+ export interface Statement {
23
+ run(...params: unknown[]): unknown;
24
+ get(...params: unknown[]): unknown;
25
+ all(...params: unknown[]): unknown[];
26
+ finalize?(): void;
27
+ }
28
+
29
+ /**
30
+ * Minimal Database instance interface shared by bun:sqlite and better-sqlite3.
31
+ *
32
+ * When consumer code writes `db: Database`, TypeScript resolves
33
+ * the *type* side of the `Database` export -- which is this interface.
34
+ */
35
+ interface DatabaseI {
36
+ exec(sql: string): void;
37
+ prepare(sql: string): Statement;
38
+ close(): void;
39
+ transaction<T>(fn: (...args: any[]) => T): (...args: any[]) => T;
40
+
41
+ // bun:sqlite specific methods used throughout the codebase
42
+ run(sql: string, params?: unknown[]): unknown;
43
+ query(sql: string): Statement;
44
+
45
+ // Allow accessing additional runtime-specific properties
46
+ [key: string]: unknown;
47
+ }
48
+
49
+ // ---------------------------------------------------------------------------
50
+ // Runtime selection
51
+ // ---------------------------------------------------------------------------
52
+
53
+ // Re-export the Database class from the appropriate backend.
54
+ // Both bun:sqlite and better-sqlite3 expose a compatible API:
55
+ // new Database(path), db.exec(sql), db.prepare(sql).run/get/all, db.close()
56
+
57
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ let _Impl: any;
59
+
60
+ if (isBun) {
61
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
62
+ _Impl = require('bun:sqlite').Database;
63
+ } else {
64
+ try {
65
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
66
+ const BetterSqlite3 = require('better-sqlite3');
67
+ // Polyfill bun:sqlite-compatible methods on better-sqlite3 instances
68
+ const OrigProto = BetterSqlite3.prototype;
69
+ if (!OrigProto.run) {
70
+ OrigProto.run = function (sql: string, params?: unknown[]) {
71
+ const stmt = this.prepare(sql);
72
+ return params ? stmt.run(...params) : stmt.run();
73
+ };
74
+ }
75
+ if (!OrigProto.query) {
76
+ OrigProto.query = function (sql: string) {
77
+ return this.prepare(sql);
78
+ };
79
+ }
80
+ _Impl = BetterSqlite3;
81
+ } catch {
82
+ throw new Error(
83
+ 'Nimbus requires either the Bun runtime (bun:sqlite) or the better-sqlite3 package.\n' +
84
+ 'Install better-sqlite3: npm install better-sqlite3\n' +
85
+ 'Or install Bun: curl -fsSL https://bun.sh/install | bash'
86
+ );
87
+ }
88
+ }
89
+
90
+ // ---------------------------------------------------------------------------
91
+ // Dual export: value + type under the same name
92
+ // ---------------------------------------------------------------------------
93
+
94
+ /**
95
+ * The Database constructor at runtime.
96
+ *
97
+ * TypeScript resolves `Database` to either the *value* (constructor) or
98
+ * the *type* (instance interface) depending on context:
99
+ * - `new Database(path)` -- uses the value
100
+ * - `db: Database` -- uses the type (the interface below)
101
+ */
102
+ const Database = _Impl as { new (path: string): DatabaseI };
103
+
104
+ /** The instance type, exported under the same name for type-position use. */
105
+ type Database = DatabaseI;
106
+
107
+ export { Database };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration Module
3
+ *
4
+ * Exports configuration management utilities
5
+ */
6
+
7
+ export { ConfigManager, configManager, CONFIG_KEYS } from './manager';
8
+ export type {
9
+ NimbusConfig,
10
+ WorkspaceConfig,
11
+ LLMConfig,
12
+ HistoryConfig,
13
+ SafetyConfig,
14
+ UIConfig,
15
+ ConfigKey,
16
+ ConfigKeyInfo,
17
+ } from './types';