@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.
- package/bin/nimbus +26 -10
- package/bin/nimbus.cmd +41 -0
- package/bin/nimbus.mjs +70 -0
- package/completions/nimbus.bash +38 -0
- package/completions/nimbus.fish +48 -0
- package/completions/nimbus.zsh +81 -0
- package/dist/src/agent/compaction-agent.js +215 -0
- package/dist/src/agent/context-manager.js +385 -0
- package/dist/src/agent/context.js +322 -0
- package/dist/src/agent/deploy-preview.js +395 -0
- package/dist/src/agent/expand-files.js +95 -0
- package/dist/src/agent/index.js +18 -0
- package/dist/src/agent/loop.js +1535 -0
- package/dist/src/agent/modes.js +347 -0
- package/dist/src/agent/permissions.js +396 -0
- package/dist/src/agent/subagents/base.js +67 -0
- package/dist/src/agent/subagents/cost.js +45 -0
- package/dist/src/agent/subagents/explore.js +36 -0
- package/dist/src/agent/subagents/general.js +41 -0
- package/dist/src/agent/subagents/index.js +88 -0
- package/dist/src/agent/subagents/infra.js +52 -0
- package/dist/src/agent/subagents/security.js +60 -0
- package/dist/src/agent/system-prompt.js +860 -0
- package/dist/src/app.js +152 -0
- package/dist/src/audit/activity-log.js +209 -0
- package/dist/src/audit/compliance-checker.js +419 -0
- package/dist/src/audit/cost-tracker.js +231 -0
- package/dist/src/audit/index.js +10 -0
- package/dist/src/audit/security-scanner.js +490 -0
- package/dist/src/auth/guard.js +64 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/keychain.js +79 -0
- package/dist/src/auth/oauth.js +389 -0
- package/dist/src/auth/providers.js +415 -0
- package/dist/src/auth/sso.js +87 -0
- package/dist/src/auth/store.js +424 -0
- package/dist/src/auth/types.js +5 -0
- package/dist/src/cli/index.js +8 -0
- package/dist/src/cli/init.js +1048 -0
- package/dist/src/cli/openapi-spec.js +346 -0
- package/dist/src/cli/run.js +505 -0
- package/dist/src/cli/serve-auth.js +56 -0
- package/dist/src/cli/serve.js +432 -0
- package/dist/src/cli/web.js +50 -0
- package/dist/src/cli.js +1574 -0
- package/dist/src/clients/core-engine-client.js +156 -0
- package/dist/src/clients/enterprise-client.js +246 -0
- package/dist/src/clients/generator-client.js +219 -0
- package/dist/src/clients/git-client.js +367 -0
- package/dist/src/clients/github-client.js +229 -0
- package/dist/src/clients/helm-client.js +299 -0
- package/dist/src/clients/index.js +18 -0
- package/dist/src/clients/k8s-client.js +270 -0
- package/dist/src/clients/llm-client.js +119 -0
- package/dist/src/clients/rest-client.js +104 -0
- package/dist/src/clients/service-discovery.js +35 -0
- package/dist/src/clients/terraform-client.js +302 -0
- package/dist/src/clients/tools-client.js +1227 -0
- package/dist/src/clients/ws-client.js +93 -0
- package/dist/src/commands/alias.js +91 -0
- package/dist/src/commands/analyze/index.js +313 -0
- package/dist/src/commands/apply/helm.js +375 -0
- package/dist/src/commands/apply/index.js +176 -0
- package/dist/src/commands/apply/k8s.js +350 -0
- package/dist/src/commands/apply/terraform.js +465 -0
- package/dist/src/commands/ask.js +137 -0
- package/dist/src/commands/audit/index.js +322 -0
- package/dist/src/commands/auth-cloud.js +345 -0
- package/dist/src/commands/auth-list.js +112 -0
- package/dist/src/commands/auth-profile.js +104 -0
- package/dist/src/commands/auth-refresh.js +161 -0
- package/dist/src/commands/auth-status.js +122 -0
- package/dist/src/commands/aws/ec2.js +402 -0
- package/dist/src/commands/aws/iam.js +304 -0
- package/dist/src/commands/aws/index.js +108 -0
- package/dist/src/commands/aws/lambda.js +317 -0
- package/dist/src/commands/aws/rds.js +345 -0
- package/dist/src/commands/aws/s3.js +346 -0
- package/dist/src/commands/aws/vpc.js +302 -0
- package/dist/src/commands/aws-discover.js +413 -0
- package/dist/src/commands/aws-terraform.js +618 -0
- package/dist/src/commands/azure/aks.js +305 -0
- package/dist/src/commands/azure/functions.js +200 -0
- package/dist/src/commands/azure/index.js +93 -0
- package/dist/src/commands/azure/storage.js +378 -0
- package/dist/src/commands/azure/vm.js +291 -0
- package/dist/src/commands/billing/index.js +224 -0
- package/dist/src/commands/chat.js +259 -0
- package/dist/src/commands/completions.js +255 -0
- package/dist/src/commands/config.js +291 -0
- package/dist/src/commands/cost/cloud-cost-estimator.js +211 -0
- package/dist/src/commands/cost/estimator.js +73 -0
- package/dist/src/commands/cost/index.js +625 -0
- package/dist/src/commands/cost/parsers/terraform.js +234 -0
- package/dist/src/commands/cost/parsers/types.js +4 -0
- package/dist/src/commands/cost/pricing/aws.js +501 -0
- package/dist/src/commands/cost/pricing/azure.js +462 -0
- package/dist/src/commands/cost/pricing/gcp.js +359 -0
- package/dist/src/commands/cost/pricing/index.js +24 -0
- package/dist/src/commands/demo.js +196 -0
- package/dist/src/commands/deploy.js +215 -0
- package/dist/src/commands/doctor.js +1291 -0
- package/dist/src/commands/drift/index.js +674 -0
- package/dist/src/commands/explain.js +235 -0
- package/dist/src/commands/export.js +120 -0
- package/dist/src/commands/feedback.js +319 -0
- package/dist/src/commands/fix.js +263 -0
- package/dist/src/commands/fs/index.js +338 -0
- package/dist/src/commands/gcp/compute.js +266 -0
- package/dist/src/commands/gcp/functions.js +221 -0
- package/dist/src/commands/gcp/gke.js +357 -0
- package/dist/src/commands/gcp/iam.js +295 -0
- package/dist/src/commands/gcp/index.js +105 -0
- package/dist/src/commands/gcp/storage.js +232 -0
- package/dist/src/commands/generate-helm.js +1026 -0
- package/dist/src/commands/generate-k8s.js +1263 -0
- package/dist/src/commands/generate-terraform.js +1058 -0
- package/dist/src/commands/gh/index.js +663 -0
- package/dist/src/commands/git/index.js +1208 -0
- package/dist/src/commands/helm/index.js +985 -0
- package/dist/src/commands/help.js +639 -0
- package/dist/src/commands/history.js +120 -0
- package/dist/src/commands/import.js +782 -0
- package/dist/src/commands/incident.js +144 -0
- package/dist/src/commands/index.js +109 -0
- package/dist/src/commands/init.js +955 -0
- package/dist/src/commands/k8s/index.js +979 -0
- package/dist/src/commands/login.js +588 -0
- package/dist/src/commands/logout.js +61 -0
- package/dist/src/commands/logs.js +160 -0
- package/dist/src/commands/onboarding.js +382 -0
- package/dist/src/commands/pipeline.js +153 -0
- package/dist/src/commands/plan/display.js +216 -0
- package/dist/src/commands/plan/index.js +525 -0
- package/dist/src/commands/plugin.js +325 -0
- package/dist/src/commands/preview.js +356 -0
- package/dist/src/commands/profile.js +297 -0
- package/dist/src/commands/questionnaire.js +1021 -0
- package/dist/src/commands/resume.js +35 -0
- package/dist/src/commands/rollback.js +259 -0
- package/dist/src/commands/rollout.js +74 -0
- package/dist/src/commands/runbook.js +307 -0
- package/dist/src/commands/schedule.js +202 -0
- package/dist/src/commands/status.js +213 -0
- package/dist/src/commands/team/index.js +309 -0
- package/dist/src/commands/team-context.js +200 -0
- package/dist/src/commands/template.js +204 -0
- package/dist/src/commands/tf/index.js +989 -0
- package/dist/src/commands/upgrade.js +515 -0
- package/dist/src/commands/usage/index.js +118 -0
- package/dist/src/commands/version.js +145 -0
- package/dist/src/commands/watch.js +127 -0
- package/dist/src/compat/index.js +2 -0
- package/dist/src/compat/runtime.js +10 -0
- package/dist/src/compat/sqlite.js +144 -0
- package/dist/src/config/index.js +6 -0
- package/dist/src/config/manager.js +469 -0
- package/dist/src/config/mode-store.js +57 -0
- package/dist/src/config/profiles.js +66 -0
- package/dist/src/config/safety-policy.js +251 -0
- package/dist/src/config/schema.js +107 -0
- package/dist/src/config/types.js +311 -0
- package/dist/src/config/workspace-state.js +38 -0
- package/dist/src/context/context-db.js +138 -0
- package/dist/src/demo/index.js +295 -0
- package/dist/src/demo/scenarios/full-journey.js +226 -0
- package/dist/src/demo/scenarios/getting-started.js +124 -0
- package/dist/src/demo/scenarios/helm-release.js +334 -0
- package/dist/src/demo/scenarios/k8s-deployment.js +190 -0
- package/dist/src/demo/scenarios/terraform-vpc.js +167 -0
- package/dist/src/demo/types.js +6 -0
- package/dist/src/engine/cost-estimator.js +334 -0
- package/dist/src/engine/diagram-generator.js +192 -0
- package/dist/src/engine/drift-detector.js +688 -0
- package/dist/src/engine/executor.js +832 -0
- package/dist/src/engine/index.js +39 -0
- package/dist/src/engine/orchestrator.js +436 -0
- package/dist/src/engine/planner.js +616 -0
- package/dist/src/engine/safety.js +609 -0
- package/dist/src/engine/verifier.js +664 -0
- package/dist/src/enterprise/audit.js +241 -0
- package/dist/src/enterprise/auth.js +189 -0
- package/dist/src/enterprise/billing.js +512 -0
- package/dist/src/enterprise/index.js +16 -0
- package/dist/src/enterprise/teams.js +315 -0
- package/dist/src/generator/best-practices.js +1375 -0
- package/dist/src/generator/helm.js +495 -0
- package/dist/src/generator/index.js +11 -0
- package/dist/src/generator/intent-parser.js +420 -0
- package/dist/src/generator/kubernetes.js +773 -0
- package/dist/src/generator/terraform.js +1472 -0
- package/dist/src/history/index.js +6 -0
- package/dist/src/history/manager.js +199 -0
- package/dist/src/history/types.js +6 -0
- package/dist/src/hooks/config.js +318 -0
- package/dist/src/hooks/engine.js +317 -0
- package/dist/src/hooks/index.js +2 -0
- package/dist/src/llm/auth-bridge.js +157 -0
- package/dist/src/llm/circuit-breaker.js +116 -0
- package/dist/src/llm/config-loader.js +172 -0
- package/dist/src/llm/cost-calculator.js +137 -0
- package/dist/src/llm/index.js +7 -0
- package/dist/src/llm/model-aliases.js +99 -0
- package/dist/src/llm/provider-registry.js +57 -0
- package/dist/src/llm/providers/anthropic.js +430 -0
- package/dist/src/llm/providers/bedrock.js +409 -0
- package/dist/src/llm/providers/google.js +344 -0
- package/dist/src/llm/providers/ollama.js +661 -0
- package/dist/src/llm/providers/openai-compatible.js +289 -0
- package/dist/src/llm/providers/openai.js +284 -0
- package/dist/src/llm/providers/openrouter.js +293 -0
- package/dist/src/llm/router.js +844 -0
- package/dist/src/llm/types.js +69 -0
- package/dist/src/lsp/client.js +239 -0
- package/dist/src/lsp/languages.js +95 -0
- package/dist/src/lsp/manager.js +243 -0
- package/dist/src/mcp/client.js +289 -0
- package/dist/src/mcp/index.js +5 -0
- package/dist/src/mcp/manager.js +113 -0
- package/dist/src/nimbus.js +212 -0
- package/dist/src/plugins/index.js +13 -0
- package/dist/src/plugins/loader.js +280 -0
- package/dist/src/plugins/manager.js +282 -0
- package/dist/src/plugins/types.js +23 -0
- package/dist/src/scanners/cicd-scanner.js +230 -0
- package/dist/src/scanners/cloud-scanner.js +415 -0
- package/dist/src/scanners/framework-scanner.js +430 -0
- package/dist/src/scanners/iac-scanner.js +350 -0
- package/dist/src/scanners/index.js +454 -0
- package/dist/src/scanners/language-scanner.js +258 -0
- package/dist/src/scanners/package-manager-scanner.js +252 -0
- package/dist/src/scanners/types.js +6 -0
- package/dist/src/sessions/manager.js +395 -0
- package/dist/src/sessions/types.js +4 -0
- package/dist/src/sharing/sync.js +238 -0
- package/dist/src/sharing/viewer.js +131 -0
- package/dist/src/snapshots/index.js +1 -0
- package/dist/src/snapshots/manager.js +432 -0
- package/dist/src/state/artifacts.js +94 -0
- package/dist/src/state/audit.js +73 -0
- package/dist/src/state/billing.js +126 -0
- package/dist/src/state/checkpoints.js +81 -0
- package/dist/src/state/config.js +58 -0
- package/dist/src/state/conversations.js +7 -0
- package/dist/src/state/credentials.js +96 -0
- package/dist/src/state/db.js +53 -0
- package/dist/src/state/index.js +23 -0
- package/dist/src/state/messages.js +76 -0
- package/dist/src/state/projects.js +92 -0
- package/dist/src/state/schema.js +233 -0
- package/dist/src/state/sessions.js +79 -0
- package/dist/src/state/teams.js +131 -0
- package/dist/src/telemetry.js +91 -0
- package/dist/src/tools/aws-ops.js +747 -0
- package/dist/src/tools/azure-ops.js +491 -0
- package/dist/src/tools/file-ops.js +451 -0
- package/dist/src/tools/gcp-ops.js +559 -0
- package/dist/src/tools/git-ops.js +557 -0
- package/dist/src/tools/github-ops.js +460 -0
- package/dist/src/tools/helm-ops.js +634 -0
- package/dist/src/tools/index.js +16 -0
- package/dist/src/tools/k8s-ops.js +579 -0
- package/dist/src/tools/schemas/converter.js +129 -0
- package/dist/src/tools/schemas/devops.js +3319 -0
- package/dist/src/tools/schemas/index.js +19 -0
- package/dist/src/tools/schemas/standard.js +966 -0
- package/dist/src/tools/schemas/types.js +409 -0
- package/dist/src/tools/spawn-exec.js +109 -0
- package/dist/src/tools/terraform-ops.js +627 -0
- package/dist/src/types/config.js +1 -0
- package/dist/src/types/drift.js +4 -0
- package/dist/src/types/enterprise.js +5 -0
- package/dist/src/types/index.js +14 -0
- package/dist/src/types/plan.js +1 -0
- package/dist/src/types/request.js +1 -0
- package/dist/src/types/response.js +1 -0
- package/dist/src/types/service.js +1 -0
- package/dist/src/ui/App.js +1672 -0
- package/dist/src/ui/DeployPreview.js +60 -0
- package/dist/src/ui/FileDiffModal.js +108 -0
- package/dist/src/ui/Header.js +46 -0
- package/dist/src/ui/HelpModal.js +9 -0
- package/dist/src/ui/InputBox.js +408 -0
- package/dist/src/ui/MessageList.js +795 -0
- package/dist/src/ui/PermissionPrompt.js +72 -0
- package/dist/src/ui/StatusBar.js +109 -0
- package/dist/src/ui/TerminalPane.js +31 -0
- package/dist/src/ui/ToolCallDisplay.js +303 -0
- package/dist/src/ui/TreePane.js +83 -0
- package/dist/src/ui/chat-ui.js +721 -0
- package/dist/src/ui/index.js +11 -0
- package/dist/src/ui/ink/index.js +1325 -0
- package/dist/src/ui/streaming.js +137 -0
- package/dist/src/ui/theme.js +78 -0
- package/dist/src/ui/types.js +7 -0
- package/dist/src/utils/analytics.js +61 -0
- package/dist/src/utils/cost-warning.js +25 -0
- package/dist/src/utils/env.js +42 -0
- package/dist/src/utils/errors.js +54 -0
- package/dist/src/utils/event-bus.js +22 -0
- package/dist/src/utils/index.js +16 -0
- package/dist/src/utils/logger.js +150 -0
- package/dist/src/utils/rate-limiter.js +90 -0
- package/dist/src/utils/service-auth.js +36 -0
- package/dist/src/utils/validation.js +39 -0
- package/dist/src/version.js +3 -0
- package/dist/src/watcher/index.js +192 -0
- package/dist/src/wizard/approval.js +275 -0
- package/dist/src/wizard/index.js +13 -0
- package/dist/src/wizard/prompts.js +273 -0
- package/dist/src/wizard/types.js +4 -0
- package/dist/src/wizard/ui.js +453 -0
- package/dist/src/wizard/wizard.js +227 -0
- package/package.json +31 -23
- package/src/__tests__/alias.test.ts +133 -0
- package/src/__tests__/app.test.ts +1 -1
- package/src/__tests__/audit.test.ts +1 -1
- package/src/__tests__/circuit-breaker.test.ts +1 -1
- package/src/__tests__/cli-run.test.ts +237 -1
- package/src/__tests__/compat-sqlite.test.ts +68 -0
- package/src/__tests__/context-manager.test.ts +131 -1
- package/src/__tests__/context.test.ts +1 -1
- package/src/__tests__/devops-terminal-gaps.test.ts +718 -0
- package/src/__tests__/doctor.test.ts +48 -0
- package/src/__tests__/enterprise.test.ts +1 -1
- package/src/__tests__/export.test.ts +236 -0
- package/src/__tests__/gap-11-18-20.test.ts +958 -0
- package/src/__tests__/generator.test.ts +1 -1
- package/src/__tests__/helm-streaming.test.ts +127 -0
- package/src/__tests__/hooks.test.ts +1 -1
- package/src/__tests__/incident.test.ts +179 -0
- package/src/__tests__/init.test.ts +55 -4
- package/src/__tests__/intent-parser.test.ts +1 -1
- package/src/__tests__/llm-router.test.ts +1 -1
- package/src/__tests__/logs.test.ts +107 -0
- package/src/__tests__/loop-errors.test.ts +244 -0
- package/src/__tests__/lsp.test.ts +1 -1
- package/src/__tests__/modes.test.ts +1 -1
- package/src/__tests__/perf-optimizations.test.ts +847 -0
- package/src/__tests__/permissions.test.ts +1 -1
- package/src/__tests__/pipeline.test.ts +50 -0
- package/src/__tests__/polish-phase3.test.ts +340 -0
- package/src/__tests__/profile.test.ts +237 -0
- package/src/__tests__/rollback.test.ts +83 -0
- package/src/__tests__/runbook.test.ts +219 -0
- package/src/__tests__/schedule.test.ts +206 -0
- package/src/__tests__/serve.test.ts +1 -1
- package/src/__tests__/sessions.test.ts +96 -1
- package/src/__tests__/sharing.test.ts +53 -1
- package/src/__tests__/snapshots.test.ts +1 -1
- package/src/__tests__/standalone-migration.test.ts +199 -0
- package/src/__tests__/state-db.test.ts +1 -1
- package/src/__tests__/status.test.ts +158 -0
- package/src/__tests__/stream-with-tools.test.ts +71 -25
- package/src/__tests__/subagents.test.ts +1 -1
- package/src/__tests__/system-prompt.test.ts +82 -3
- package/src/__tests__/terminal-gap-v2.test.ts +395 -0
- package/src/__tests__/terminal-parity.test.ts +393 -0
- package/src/__tests__/tf-apply.test.ts +187 -0
- package/src/__tests__/tool-converter.test.ts +1 -1
- package/src/__tests__/tool-schemas.test.ts +209 -4
- package/src/__tests__/tools.test.ts +4 -3
- package/src/__tests__/version-json.test.ts +184 -0
- package/src/__tests__/version.test.ts +1 -1
- package/src/__tests__/watch.test.ts +129 -0
- package/src/agent/compaction-agent.ts +40 -1
- package/src/agent/context-manager.ts +67 -3
- package/src/agent/deploy-preview.ts +62 -1
- package/src/agent/expand-files.ts +108 -0
- package/src/agent/loop.ts +1312 -31
- package/src/agent/permissions.ts +51 -4
- package/src/agent/system-prompt.ts +573 -19
- package/src/app.ts +58 -0
- package/src/audit/security-scanner.ts +45 -0
- package/src/auth/keychain.ts +82 -0
- package/src/auth/oauth.ts +15 -5
- package/src/cli/init.ts +378 -5
- package/src/cli/run.ts +407 -16
- package/src/cli/serve.ts +78 -1
- package/src/cli/web.ts +10 -6
- package/src/cli.ts +312 -1
- package/src/clients/service-discovery.ts +30 -25
- package/src/commands/alias.ts +100 -0
- package/src/commands/audit/index.ts +121 -2
- package/src/commands/auth-cloud.ts +113 -0
- package/src/commands/auth-refresh.ts +187 -0
- package/src/commands/aws-discover.ts +144 -251
- package/src/commands/aws-terraform.ts +68 -118
- package/src/commands/chat.ts +9 -3
- package/src/commands/completions.ts +268 -0
- package/src/commands/config.ts +26 -0
- package/src/commands/cost/index.ts +218 -2
- package/src/commands/deploy.ts +260 -0
- package/src/commands/doctor.ts +744 -152
- package/src/commands/drift/index.ts +371 -23
- package/src/commands/export.ts +146 -0
- package/src/commands/generate-k8s.ts +9 -61
- package/src/commands/generate-terraform.ts +191 -449
- package/src/commands/help.ts +212 -36
- package/src/commands/history.ts +8 -1
- package/src/commands/incident.ts +166 -0
- package/src/commands/init.ts +5 -0
- package/src/commands/login.ts +86 -1
- package/src/commands/logs.ts +167 -0
- package/src/commands/onboarding.ts +211 -34
- package/src/commands/pipeline.ts +186 -0
- package/src/commands/plugin.ts +398 -0
- package/src/commands/profile.ts +342 -0
- package/src/commands/questionnaire.ts +0 -98
- package/src/commands/resume.ts +26 -34
- package/src/commands/rollback.ts +315 -0
- package/src/commands/rollout.ts +88 -0
- package/src/commands/runbook.ts +346 -0
- package/src/commands/schedule.ts +236 -0
- package/src/commands/status.ts +252 -0
- package/src/commands/team-context.ts +220 -0
- package/src/commands/template.ts +58 -57
- package/src/commands/tf/index.ts +70 -11
- package/src/commands/upgrade.ts +57 -0
- package/src/commands/version.ts +54 -50
- package/src/commands/watch.ts +153 -0
- package/src/compat/runtime.ts +1 -1
- package/src/compat/sqlite.ts +75 -5
- package/src/config/mode-store.ts +62 -0
- package/src/config/profiles.ts +84 -0
- package/src/config/types.ts +83 -1
- package/src/config/workspace-state.ts +53 -0
- package/src/engine/cost-estimator.ts +52 -10
- package/src/engine/executor.ts +33 -2
- package/src/engine/planner.ts +68 -1
- package/src/generator/terraform.ts +8 -0
- package/src/history/manager.ts +2 -74
- package/src/hooks/engine.ts +5 -4
- package/src/llm/cost-calculator.ts +2 -2
- package/src/llm/providers/anthropic.ts +50 -21
- package/src/llm/router.ts +76 -7
- package/src/lsp/languages.ts +3 -0
- package/src/lsp/manager.ts +21 -5
- package/src/nimbus.ts +37 -18
- package/src/sessions/manager.ts +108 -1
- package/src/sharing/sync.ts +4 -0
- package/src/sharing/viewer.ts +66 -0
- package/src/tools/file-ops.ts +22 -0
- package/src/tools/schemas/devops.ts +3007 -117
- package/src/tools/schemas/standard.ts +5 -1
- package/src/tools/schemas/types.ts +31 -1
- package/src/tools/spawn-exec.ts +148 -0
- package/src/ui/App.tsx +1183 -66
- package/src/ui/DeployPreview.tsx +62 -57
- package/src/ui/FileDiffModal.tsx +162 -0
- package/src/ui/Header.tsx +87 -24
- package/src/ui/HelpModal.tsx +57 -0
- package/src/ui/InputBox.tsx +163 -10
- package/src/ui/MessageList.tsx +487 -40
- package/src/ui/PermissionPrompt.tsx +17 -5
- package/src/ui/StatusBar.tsx +122 -3
- package/src/ui/TerminalPane.tsx +84 -0
- package/src/ui/ToolCallDisplay.tsx +252 -18
- package/src/ui/TreePane.tsx +132 -0
- package/src/ui/chat-ui.ts +41 -44
- package/src/ui/ink/index.ts +771 -38
- package/src/ui/streaming.ts +1 -1
- package/src/ui/theme.ts +104 -0
- package/src/ui/types.ts +18 -0
- package/src/version.ts +1 -1
- package/src/watcher/index.ts +66 -15
- package/src/wizard/types.ts +1 -0
- package/src/wizard/ui.ts +1 -1
- package/tsconfig.json +2 -2
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Wrapper for AWS CLI operations with enhanced output and safety checks
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* nimbus aws ec2 list
|
|
8
|
+
* nimbus aws s3 ls
|
|
9
|
+
* nimbus aws rds list
|
|
10
|
+
* nimbus aws lambda list
|
|
11
|
+
* nimbus aws iam users
|
|
12
|
+
* nimbus aws vpc list
|
|
13
|
+
*/
|
|
14
|
+
import { logger } from '../../utils';
|
|
15
|
+
import { ui } from '../../wizard/ui';
|
|
16
|
+
import { ec2Command } from './ec2';
|
|
17
|
+
import { s3Command } from './s3';
|
|
18
|
+
import { rdsCommand } from './rds';
|
|
19
|
+
import { lambdaCommand } from './lambda';
|
|
20
|
+
import { iamCommand } from './iam';
|
|
21
|
+
import { vpcCommand } from './vpc';
|
|
22
|
+
/**
|
|
23
|
+
* Parse common AWS options from args
|
|
24
|
+
*/
|
|
25
|
+
export function parseAwsOptions(args) {
|
|
26
|
+
const options = {};
|
|
27
|
+
for (let i = 0; i < args.length; i++) {
|
|
28
|
+
const arg = args[i];
|
|
29
|
+
if ((arg === '--profile' || arg === '-p') && args[i + 1]) {
|
|
30
|
+
options.profile = args[++i];
|
|
31
|
+
}
|
|
32
|
+
else if ((arg === '--region' || arg === '-r') && args[i + 1]) {
|
|
33
|
+
options.region = args[++i];
|
|
34
|
+
}
|
|
35
|
+
else if ((arg === '--output' || arg === '-o') && args[i + 1]) {
|
|
36
|
+
options.output = args[++i];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return options;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Main AWS command router
|
|
43
|
+
*/
|
|
44
|
+
export async function awsCommand(subcommand, args) {
|
|
45
|
+
logger.info('Running AWS command', { subcommand, args });
|
|
46
|
+
const options = parseAwsOptions(args);
|
|
47
|
+
const positionalArgs = args.filter(arg => !arg.startsWith('-') && !arg.startsWith('--'));
|
|
48
|
+
switch (subcommand) {
|
|
49
|
+
case 'ec2':
|
|
50
|
+
await ec2Command(positionalArgs[0], positionalArgs.slice(1), options);
|
|
51
|
+
break;
|
|
52
|
+
case 's3':
|
|
53
|
+
await s3Command(positionalArgs[0], positionalArgs.slice(1), options);
|
|
54
|
+
break;
|
|
55
|
+
case 'rds':
|
|
56
|
+
await rdsCommand(positionalArgs[0], positionalArgs.slice(1), options);
|
|
57
|
+
break;
|
|
58
|
+
case 'lambda':
|
|
59
|
+
await lambdaCommand(positionalArgs[0], positionalArgs.slice(1), options);
|
|
60
|
+
break;
|
|
61
|
+
case 'iam':
|
|
62
|
+
await iamCommand(positionalArgs[0], positionalArgs.slice(1), options);
|
|
63
|
+
break;
|
|
64
|
+
case 'vpc':
|
|
65
|
+
await vpcCommand(positionalArgs[0], positionalArgs.slice(1), options);
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
showAwsHelp();
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Show AWS command help
|
|
74
|
+
*/
|
|
75
|
+
function showAwsHelp() {
|
|
76
|
+
ui.header('Nimbus AWS Commands');
|
|
77
|
+
ui.newLine();
|
|
78
|
+
ui.print('Usage: nimbus aws <service> <action> [options]');
|
|
79
|
+
ui.newLine();
|
|
80
|
+
ui.print(ui.bold('Services:'));
|
|
81
|
+
ui.print(' ec2 EC2 instance operations');
|
|
82
|
+
ui.print(' s3 S3 bucket and object operations');
|
|
83
|
+
ui.print(' rds RDS database operations');
|
|
84
|
+
ui.print(' lambda Lambda function operations');
|
|
85
|
+
ui.print(' iam IAM user, role, and policy operations');
|
|
86
|
+
ui.print(' vpc VPC and networking operations');
|
|
87
|
+
ui.newLine();
|
|
88
|
+
ui.print(ui.bold('Common Options:'));
|
|
89
|
+
ui.print(' --profile, -p AWS profile to use');
|
|
90
|
+
ui.print(' --region, -r AWS region');
|
|
91
|
+
ui.print(' --output, -o Output format (json, table, text)');
|
|
92
|
+
ui.newLine();
|
|
93
|
+
ui.print(ui.bold('Examples:'));
|
|
94
|
+
ui.print(' nimbus aws ec2 list List all EC2 instances');
|
|
95
|
+
ui.print(' nimbus aws ec2 describe i-1234567890 Describe specific instance');
|
|
96
|
+
ui.print(' nimbus aws s3 ls List all S3 buckets');
|
|
97
|
+
ui.print(' nimbus aws s3 ls my-bucket List objects in bucket');
|
|
98
|
+
ui.print(' nimbus aws rds list List all RDS instances');
|
|
99
|
+
ui.print(' nimbus aws lambda list List all Lambda functions');
|
|
100
|
+
}
|
|
101
|
+
// Re-export subcommands
|
|
102
|
+
export { ec2Command } from './ec2';
|
|
103
|
+
export { s3Command } from './s3';
|
|
104
|
+
export { rdsCommand } from './rds';
|
|
105
|
+
export { lambdaCommand } from './lambda';
|
|
106
|
+
export { iamCommand } from './iam';
|
|
107
|
+
export { vpcCommand } from './vpc';
|
|
108
|
+
export default awsCommand;
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Lambda Commands
|
|
3
|
+
*
|
|
4
|
+
* Lambda function operations
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* nimbus aws lambda list
|
|
8
|
+
* nimbus aws lambda invoke <function-name>
|
|
9
|
+
* nimbus aws lambda logs <function-name>
|
|
10
|
+
*/
|
|
11
|
+
import { logger } from '../../utils';
|
|
12
|
+
import { ui } from '../../wizard/ui';
|
|
13
|
+
import { confirm, input } from '../../wizard/prompts';
|
|
14
|
+
/**
|
|
15
|
+
* Lambda command router
|
|
16
|
+
*/
|
|
17
|
+
export async function lambdaCommand(action, args, options) {
|
|
18
|
+
logger.info('Running Lambda command', { action, args, options });
|
|
19
|
+
switch (action) {
|
|
20
|
+
case 'list':
|
|
21
|
+
case 'ls':
|
|
22
|
+
await listFunctions(options);
|
|
23
|
+
break;
|
|
24
|
+
case 'invoke':
|
|
25
|
+
if (!args[0]) {
|
|
26
|
+
ui.error('Function name is required');
|
|
27
|
+
ui.print('Usage: nimbus aws lambda invoke <function-name>');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
await invokeFunction(args[0], args[1], options);
|
|
31
|
+
break;
|
|
32
|
+
case 'logs':
|
|
33
|
+
if (!args[0]) {
|
|
34
|
+
ui.error('Function name is required');
|
|
35
|
+
ui.print('Usage: nimbus aws lambda logs <function-name>');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await getFunctionLogs(args[0], options);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
showLambdaHelp();
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* List all Lambda functions
|
|
47
|
+
*/
|
|
48
|
+
async function listFunctions(options) {
|
|
49
|
+
ui.header('Lambda Functions');
|
|
50
|
+
ui.startSpinner({ message: 'Fetching Lambda functions...' });
|
|
51
|
+
try {
|
|
52
|
+
const result = await runAwsCommand('lambda list-functions', options);
|
|
53
|
+
const functions = result.Functions || [];
|
|
54
|
+
ui.stopSpinnerSuccess(`Found ${functions.length} function(s)`);
|
|
55
|
+
ui.newLine();
|
|
56
|
+
if (functions.length === 0) {
|
|
57
|
+
ui.info('No Lambda functions found');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Display table
|
|
61
|
+
displayFunctionTable(functions);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
ui.stopSpinnerFail('Failed to list functions');
|
|
65
|
+
ui.error(error.message);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Invoke a Lambda function
|
|
70
|
+
*/
|
|
71
|
+
async function invokeFunction(functionName, payload, options) {
|
|
72
|
+
ui.header(`Invoke Lambda: ${functionName}`);
|
|
73
|
+
// Get payload if not provided
|
|
74
|
+
let invokePayload = payload;
|
|
75
|
+
if (!invokePayload) {
|
|
76
|
+
invokePayload = await input({
|
|
77
|
+
message: 'Enter payload (JSON):',
|
|
78
|
+
defaultValue: '{}',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Validate JSON
|
|
82
|
+
try {
|
|
83
|
+
JSON.parse(invokePayload);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
ui.error('Invalid JSON payload');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const proceed = await confirm({
|
|
90
|
+
message: `Invoke function ${functionName}?`,
|
|
91
|
+
defaultValue: true,
|
|
92
|
+
});
|
|
93
|
+
if (!proceed) {
|
|
94
|
+
ui.info('Operation cancelled');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
ui.startSpinner({ message: 'Invoking function...' });
|
|
98
|
+
try {
|
|
99
|
+
const { execFile } = await import('child_process');
|
|
100
|
+
const { promisify } = await import('util');
|
|
101
|
+
const fs = await import('fs/promises');
|
|
102
|
+
const os = await import('os');
|
|
103
|
+
const path = await import('path');
|
|
104
|
+
const execFileAsync = promisify(execFile);
|
|
105
|
+
// Write payload to temp file
|
|
106
|
+
const tempFile = path.join(os.tmpdir(), `lambda-payload-${Date.now()}.json`);
|
|
107
|
+
await fs.writeFile(tempFile, invokePayload);
|
|
108
|
+
// Invoke Lambda
|
|
109
|
+
const args = [
|
|
110
|
+
'lambda',
|
|
111
|
+
'invoke',
|
|
112
|
+
'--function-name',
|
|
113
|
+
functionName,
|
|
114
|
+
'--payload',
|
|
115
|
+
`file://${tempFile}`,
|
|
116
|
+
'--cli-binary-format',
|
|
117
|
+
'raw-in-base64-out',
|
|
118
|
+
];
|
|
119
|
+
if (options.profile) {
|
|
120
|
+
args.push('--profile', options.profile);
|
|
121
|
+
}
|
|
122
|
+
if (options.region) {
|
|
123
|
+
args.push('--region', options.region);
|
|
124
|
+
}
|
|
125
|
+
const outputFile = path.join(os.tmpdir(), `lambda-response-${Date.now()}.json`);
|
|
126
|
+
args.push(outputFile);
|
|
127
|
+
const { stdout } = await execFileAsync('aws', args);
|
|
128
|
+
ui.stopSpinnerSuccess('Function invoked');
|
|
129
|
+
ui.newLine();
|
|
130
|
+
// Parse invocation result
|
|
131
|
+
const result = JSON.parse(stdout);
|
|
132
|
+
ui.print(ui.bold('Invocation Result:'));
|
|
133
|
+
ui.print(` Status Code: ${result.StatusCode}`);
|
|
134
|
+
if (result.FunctionError) {
|
|
135
|
+
ui.print(` Error: ${ui.color(result.FunctionError, 'red')}`);
|
|
136
|
+
}
|
|
137
|
+
// Read response
|
|
138
|
+
try {
|
|
139
|
+
const response = await fs.readFile(outputFile, 'utf-8');
|
|
140
|
+
ui.newLine();
|
|
141
|
+
ui.print(ui.bold('Response:'));
|
|
142
|
+
ui.print(response);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// No response file
|
|
146
|
+
}
|
|
147
|
+
// Cleanup
|
|
148
|
+
await fs.unlink(tempFile).catch(() => { });
|
|
149
|
+
await fs.unlink(outputFile).catch(() => { });
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
ui.stopSpinnerFail('Invocation failed');
|
|
153
|
+
ui.error(error.message);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get Lambda function logs
|
|
158
|
+
*/
|
|
159
|
+
async function getFunctionLogs(functionName, options) {
|
|
160
|
+
ui.header(`Lambda Logs: ${functionName}`);
|
|
161
|
+
ui.startSpinner({ message: 'Fetching logs...' });
|
|
162
|
+
try {
|
|
163
|
+
const { execFile } = await import('child_process');
|
|
164
|
+
const { promisify } = await import('util');
|
|
165
|
+
const execFileAsync = promisify(execFile);
|
|
166
|
+
// Get log group name
|
|
167
|
+
const logGroupName = `/aws/lambda/${functionName}`;
|
|
168
|
+
// Fetch recent log streams
|
|
169
|
+
const args = [
|
|
170
|
+
'logs',
|
|
171
|
+
'describe-log-streams',
|
|
172
|
+
'--log-group-name',
|
|
173
|
+
logGroupName,
|
|
174
|
+
'--order-by',
|
|
175
|
+
'LastEventTime',
|
|
176
|
+
'--descending',
|
|
177
|
+
'--limit',
|
|
178
|
+
'1',
|
|
179
|
+
'--output',
|
|
180
|
+
'json',
|
|
181
|
+
];
|
|
182
|
+
if (options.profile) {
|
|
183
|
+
args.push('--profile', options.profile);
|
|
184
|
+
}
|
|
185
|
+
if (options.region) {
|
|
186
|
+
args.push('--region', options.region);
|
|
187
|
+
}
|
|
188
|
+
const { stdout: streamsOutput } = await execFileAsync('aws', args);
|
|
189
|
+
const streams = JSON.parse(streamsOutput);
|
|
190
|
+
if (!streams.logStreams || streams.logStreams.length === 0) {
|
|
191
|
+
ui.stopSpinnerSuccess('');
|
|
192
|
+
ui.info('No log streams found');
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const latestStream = streams.logStreams[0].logStreamName;
|
|
196
|
+
// Fetch log events
|
|
197
|
+
const logArgs = [
|
|
198
|
+
'logs',
|
|
199
|
+
'get-log-events',
|
|
200
|
+
'--log-group-name',
|
|
201
|
+
logGroupName,
|
|
202
|
+
'--log-stream-name',
|
|
203
|
+
latestStream,
|
|
204
|
+
'--limit',
|
|
205
|
+
'50',
|
|
206
|
+
'--output',
|
|
207
|
+
'json',
|
|
208
|
+
];
|
|
209
|
+
if (options.profile) {
|
|
210
|
+
logArgs.push('--profile', options.profile);
|
|
211
|
+
}
|
|
212
|
+
if (options.region) {
|
|
213
|
+
logArgs.push('--region', options.region);
|
|
214
|
+
}
|
|
215
|
+
const { stdout: logsOutput } = await execFileAsync('aws', logArgs);
|
|
216
|
+
const logs = JSON.parse(logsOutput);
|
|
217
|
+
ui.stopSpinnerSuccess('Logs retrieved');
|
|
218
|
+
ui.newLine();
|
|
219
|
+
if (!logs.events || logs.events.length === 0) {
|
|
220
|
+
ui.info('No log events found');
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
ui.print(ui.bold(`Recent logs from: ${latestStream}`));
|
|
224
|
+
ui.newLine();
|
|
225
|
+
for (const event of logs.events) {
|
|
226
|
+
const timestamp = new Date(event.timestamp).toISOString();
|
|
227
|
+
ui.print(`${ui.dim(timestamp)} ${event.message.trim()}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
ui.stopSpinnerFail('Failed to fetch logs');
|
|
232
|
+
ui.error(error.message);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Run AWS CLI command and parse JSON output
|
|
237
|
+
*/
|
|
238
|
+
async function runAwsCommand(command, options) {
|
|
239
|
+
const { execFile } = await import('child_process');
|
|
240
|
+
const { promisify } = await import('util');
|
|
241
|
+
const execFileAsync = promisify(execFile);
|
|
242
|
+
const args = command.split(' ');
|
|
243
|
+
const baseCommand = args[0];
|
|
244
|
+
const commandArgs = args.slice(1);
|
|
245
|
+
// Add common options
|
|
246
|
+
if (options.profile) {
|
|
247
|
+
commandArgs.push('--profile', options.profile);
|
|
248
|
+
}
|
|
249
|
+
if (options.region) {
|
|
250
|
+
commandArgs.push('--region', options.region);
|
|
251
|
+
}
|
|
252
|
+
commandArgs.push('--output', 'json');
|
|
253
|
+
const { stdout } = await execFileAsync('aws', [baseCommand, ...commandArgs]);
|
|
254
|
+
return JSON.parse(stdout);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Display functions in a table format
|
|
258
|
+
*/
|
|
259
|
+
function displayFunctionTable(functions) {
|
|
260
|
+
const headers = ['Name', 'Runtime', 'Memory', 'Timeout', 'Code Size', 'Modified'];
|
|
261
|
+
const rows = functions.map(fn => [
|
|
262
|
+
fn.FunctionName,
|
|
263
|
+
fn.Runtime || 'N/A',
|
|
264
|
+
`${fn.MemorySize} MB`,
|
|
265
|
+
`${fn.Timeout}s`,
|
|
266
|
+
formatBytes(fn.CodeSize),
|
|
267
|
+
new Date(fn.LastModified).toLocaleDateString(),
|
|
268
|
+
]);
|
|
269
|
+
// Print header
|
|
270
|
+
const headerRow = headers
|
|
271
|
+
.map((h, i) => {
|
|
272
|
+
const maxWidth = Math.max(h.length, ...rows.map(r => r[i].length));
|
|
273
|
+
return h.padEnd(maxWidth);
|
|
274
|
+
})
|
|
275
|
+
.join(' ');
|
|
276
|
+
ui.print(ui.bold(headerRow));
|
|
277
|
+
ui.print('-'.repeat(headerRow.length));
|
|
278
|
+
// Print rows
|
|
279
|
+
for (const row of rows) {
|
|
280
|
+
const formattedRow = row
|
|
281
|
+
.map((cell, i) => {
|
|
282
|
+
const maxWidth = Math.max(headers[i].length, ...rows.map(r => r[i].length));
|
|
283
|
+
return cell.padEnd(maxWidth);
|
|
284
|
+
})
|
|
285
|
+
.join(' ');
|
|
286
|
+
ui.print(formattedRow);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Format bytes to human readable
|
|
291
|
+
*/
|
|
292
|
+
function formatBytes(bytes) {
|
|
293
|
+
if (bytes === 0) {
|
|
294
|
+
return '0 B';
|
|
295
|
+
}
|
|
296
|
+
const k = 1024;
|
|
297
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
298
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
299
|
+
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Show Lambda command help
|
|
303
|
+
*/
|
|
304
|
+
function showLambdaHelp() {
|
|
305
|
+
ui.print('Usage: nimbus aws lambda <action> [args]');
|
|
306
|
+
ui.newLine();
|
|
307
|
+
ui.print(ui.bold('Actions:'));
|
|
308
|
+
ui.print(' list List all Lambda functions');
|
|
309
|
+
ui.print(' invoke <name> Invoke a function');
|
|
310
|
+
ui.print(' logs <name> View function logs');
|
|
311
|
+
ui.newLine();
|
|
312
|
+
ui.print(ui.bold('Examples:'));
|
|
313
|
+
ui.print(' nimbus aws lambda list');
|
|
314
|
+
ui.print(' nimbus aws lambda invoke my-function \'{"key": "value"}\'');
|
|
315
|
+
ui.print(' nimbus aws lambda logs my-function');
|
|
316
|
+
}
|
|
317
|
+
export default lambdaCommand;
|