@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
package/src/ui/streaming.ts
CHANGED
|
@@ -24,7 +24,7 @@ export class StreamingDisplay {
|
|
|
24
24
|
private options: Required<StreamingDisplayOptions>;
|
|
25
25
|
private buffer: string = '';
|
|
26
26
|
private lineStarted: boolean = false;
|
|
27
|
-
private cursorInterval?:
|
|
27
|
+
private cursorInterval?: ReturnType<typeof setTimeout>;
|
|
28
28
|
|
|
29
29
|
constructor(options: StreamingDisplayOptions = {}) {
|
|
30
30
|
this.options = {
|
package/src/ui/theme.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme system for Nimbus TUI.
|
|
3
|
+
*
|
|
4
|
+
* Provides named color themes (dark, light) that can be switched at runtime.
|
|
5
|
+
* Components should import `activeTheme` and use its color properties instead
|
|
6
|
+
* of hardcoding color strings.
|
|
7
|
+
*
|
|
8
|
+
* Theme preference is persisted to ~/.nimbus/config.yaml.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import * as os from 'node:os';
|
|
14
|
+
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Types
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
export interface Theme {
|
|
20
|
+
name: string;
|
|
21
|
+
/** Primary accent color (headers, prompts). */
|
|
22
|
+
primary: string;
|
|
23
|
+
/** Secondary accent color (highlights). */
|
|
24
|
+
secondary: string;
|
|
25
|
+
/** Success / create indicator. */
|
|
26
|
+
success: string;
|
|
27
|
+
/** Warning indicator. */
|
|
28
|
+
warning: string;
|
|
29
|
+
/** Error / destroy indicator. */
|
|
30
|
+
error: string;
|
|
31
|
+
/** Dim text and separators. */
|
|
32
|
+
muted: string;
|
|
33
|
+
/** Border color. */
|
|
34
|
+
border: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Built-in themes
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
export const THEMES: Record<string, Theme> = {
|
|
42
|
+
dark: {
|
|
43
|
+
name: 'dark',
|
|
44
|
+
primary: 'cyan',
|
|
45
|
+
secondary: 'blue',
|
|
46
|
+
success: 'green',
|
|
47
|
+
warning: 'yellow',
|
|
48
|
+
error: 'red',
|
|
49
|
+
muted: 'gray',
|
|
50
|
+
border: 'gray',
|
|
51
|
+
},
|
|
52
|
+
light: {
|
|
53
|
+
name: 'light',
|
|
54
|
+
primary: 'blue',
|
|
55
|
+
secondary: 'magenta',
|
|
56
|
+
success: 'green',
|
|
57
|
+
warning: 'yellow',
|
|
58
|
+
error: 'red',
|
|
59
|
+
muted: 'gray',
|
|
60
|
+
border: 'white',
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Active theme (mutable singleton)
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
|
|
68
|
+
export let activeTheme: Theme = THEMES.dark;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Switch the active theme by name.
|
|
72
|
+
* Falls back to `dark` if the name is not recognized.
|
|
73
|
+
* Persists the chosen theme name to ~/.nimbus/config.yaml.
|
|
74
|
+
*/
|
|
75
|
+
export function setTheme(name: string): void {
|
|
76
|
+
activeTheme = THEMES[name] ?? THEMES.dark;
|
|
77
|
+
// Persist to config file
|
|
78
|
+
try {
|
|
79
|
+
const configDir = path.join(os.homedir(), '.nimbus');
|
|
80
|
+
const configFile = path.join(configDir, 'config.yaml');
|
|
81
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
82
|
+
let config = '';
|
|
83
|
+
try {
|
|
84
|
+
config = fs.readFileSync(configFile, 'utf-8');
|
|
85
|
+
} catch {
|
|
86
|
+
/* new file */
|
|
87
|
+
}
|
|
88
|
+
if (config.includes('theme:')) {
|
|
89
|
+
config = config.replace(/^theme:.*$/m, `theme: ${name}`);
|
|
90
|
+
} else {
|
|
91
|
+
config = config ? `${config.trim()}\ntheme: ${name}\n` : `theme: ${name}\n`;
|
|
92
|
+
}
|
|
93
|
+
fs.writeFileSync(configFile, config, 'utf-8');
|
|
94
|
+
} catch {
|
|
95
|
+
/* ignore FS errors */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* List all available theme names.
|
|
101
|
+
*/
|
|
102
|
+
export function listThemes(): string[] {
|
|
103
|
+
return Object.keys(THEMES);
|
|
104
|
+
}
|
package/src/ui/types.ts
CHANGED
|
@@ -15,6 +15,12 @@ export interface UIMessage {
|
|
|
15
15
|
content: string;
|
|
16
16
|
timestamp: Date;
|
|
17
17
|
toolCalls?: UIToolCall[];
|
|
18
|
+
/**
|
|
19
|
+
* Pre-computed content segments (text + code blocks) produced by parseContent().
|
|
20
|
+
* When set, MessageList skips the parsing step for this message entirely.
|
|
21
|
+
* Kept on UIMessage (not LLMMessage) to maintain a clean LLM/UI boundary.
|
|
22
|
+
*/
|
|
23
|
+
_precomputedSegments?: Array<{ type: 'text' | 'code'; content: string; language?: string }>;
|
|
18
24
|
}
|
|
19
25
|
|
|
20
26
|
/** A tool invocation attached to an assistant message. */
|
|
@@ -26,6 +32,10 @@ export interface UIToolCall {
|
|
|
26
32
|
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
27
33
|
/** Elapsed wall-clock time in milliseconds. */
|
|
28
34
|
duration?: number;
|
|
35
|
+
/** Unix timestamp (Date.now()) when the tool call started, for elapsed timer. */
|
|
36
|
+
startTime?: number;
|
|
37
|
+
/** Live stdout/stderr lines streamed during execution (Gap 1). */
|
|
38
|
+
streamingOutput?: string;
|
|
29
39
|
}
|
|
30
40
|
|
|
31
41
|
/** Metadata about the current agent session. */
|
|
@@ -37,6 +47,14 @@ export interface SessionInfo {
|
|
|
37
47
|
maxTokens: number;
|
|
38
48
|
costUSD: number;
|
|
39
49
|
snapshotCount: number;
|
|
50
|
+
/** Active kubectl context (G1). */
|
|
51
|
+
kubectlContext?: string;
|
|
52
|
+
/** Active Terraform workspace (G1). */
|
|
53
|
+
terraformWorkspace?: string;
|
|
54
|
+
/** Infra cost delta string from infracost (G15). */
|
|
55
|
+
infraCostDelta?: string;
|
|
56
|
+
/** LLM connectivity health (GAP-2). */
|
|
57
|
+
llmHealth?: 'checking' | 'ok' | 'error';
|
|
40
58
|
}
|
|
41
59
|
|
|
42
60
|
/** A single resource-level change shown in the deploy preview. */
|
package/src/version.ts
CHANGED
package/src/watcher/index.ts
CHANGED
|
@@ -17,7 +17,10 @@ export interface FileChangeEvent {
|
|
|
17
17
|
|
|
18
18
|
export class FileWatcher extends EventEmitter {
|
|
19
19
|
private watcher: fs.FSWatcher | null = null;
|
|
20
|
-
|
|
20
|
+
/** Circular ring buffer for file-change events (avoids O(n) shift on cap). */
|
|
21
|
+
private readonly changesBuffer: FileChangeEvent[];
|
|
22
|
+
private changesHead = 0; // index of the next write slot
|
|
23
|
+
private changesSize = 0; // number of valid entries currently stored
|
|
21
24
|
private readonly maxChanges = 100;
|
|
22
25
|
private readonly ignorePatterns = [
|
|
23
26
|
'node_modules',
|
|
@@ -31,6 +34,29 @@ export class FileWatcher extends EventEmitter {
|
|
|
31
34
|
|
|
32
35
|
constructor(private readonly rootDir: string) {
|
|
33
36
|
super();
|
|
37
|
+
this.changesBuffer = new Array(this.maxChanges);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Push a change event into the ring buffer (O(1)). */
|
|
41
|
+
private pushChange(event: FileChangeEvent): void {
|
|
42
|
+
this.changesBuffer[this.changesHead] = event;
|
|
43
|
+
this.changesHead = (this.changesHead + 1) % this.maxChanges;
|
|
44
|
+
if (this.changesSize < this.maxChanges) {
|
|
45
|
+
this.changesSize++;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Return all stored change events in chronological order. */
|
|
50
|
+
private getOrderedChanges(): FileChangeEvent[] {
|
|
51
|
+
if (this.changesSize === 0) return [];
|
|
52
|
+
const start = this.changesSize < this.maxChanges
|
|
53
|
+
? 0
|
|
54
|
+
: this.changesHead; // oldest slot when buffer is full
|
|
55
|
+
const result: FileChangeEvent[] = new Array(this.changesSize);
|
|
56
|
+
for (let i = 0; i < this.changesSize; i++) {
|
|
57
|
+
result[i] = this.changesBuffer[(start + i) % this.maxChanges];
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
34
60
|
}
|
|
35
61
|
|
|
36
62
|
/**
|
|
@@ -64,10 +90,7 @@ export class FileWatcher extends EventEmitter {
|
|
|
64
90
|
timestamp: Date.now(),
|
|
65
91
|
};
|
|
66
92
|
|
|
67
|
-
this.
|
|
68
|
-
if (this.changes.length > this.maxChanges) {
|
|
69
|
-
this.changes.shift();
|
|
70
|
-
}
|
|
93
|
+
this.pushChange(event);
|
|
71
94
|
|
|
72
95
|
this.emit('change', event);
|
|
73
96
|
});
|
|
@@ -98,10 +121,7 @@ export class FileWatcher extends EventEmitter {
|
|
|
98
121
|
path: fullPath,
|
|
99
122
|
timestamp: Date.now(),
|
|
100
123
|
};
|
|
101
|
-
this.
|
|
102
|
-
if (this.changes.length > this.maxChanges) {
|
|
103
|
-
this.changes.shift();
|
|
104
|
-
}
|
|
124
|
+
this.pushChange(event);
|
|
105
125
|
this.emit('change', event);
|
|
106
126
|
});
|
|
107
127
|
}
|
|
@@ -129,22 +149,52 @@ export class FileWatcher extends EventEmitter {
|
|
|
129
149
|
* Get recent changes since a timestamp.
|
|
130
150
|
*/
|
|
131
151
|
getChangesSince(timestamp: number): FileChangeEvent[] {
|
|
132
|
-
return this.
|
|
152
|
+
return this.getOrderedChanges().filter(c => c.timestamp > timestamp);
|
|
133
153
|
}
|
|
134
154
|
|
|
135
155
|
/**
|
|
136
156
|
* Get a summary of recent changes for the agent context.
|
|
157
|
+
* When `devopsOnly` is true, filters to DevOps-relevant files only:
|
|
158
|
+
* .tf, .yaml, .yml, Dockerfile, docker-compose.*, Jenkinsfile, .github/workflows/*.
|
|
137
159
|
*/
|
|
138
|
-
getSummary(since?: number): string {
|
|
139
|
-
const relevant = since ? this.getChangesSince(since) : this.
|
|
160
|
+
getSummary(since?: number, devopsOnly = false): string {
|
|
161
|
+
const relevant = since ? this.getChangesSince(since) : this.getOrderedChanges();
|
|
140
162
|
if (relevant.length === 0) {
|
|
141
163
|
return '';
|
|
142
164
|
}
|
|
143
165
|
|
|
144
|
-
const
|
|
166
|
+
const filtered = devopsOnly
|
|
167
|
+
? relevant.filter(c => {
|
|
168
|
+
const f = c.path.toLowerCase();
|
|
169
|
+
const base = path.basename(f);
|
|
170
|
+
return (
|
|
171
|
+
f.endsWith('.tf') ||
|
|
172
|
+
f.endsWith('.tfvars') ||
|
|
173
|
+
f.endsWith('.yaml') ||
|
|
174
|
+
f.endsWith('.yml') ||
|
|
175
|
+
base === 'dockerfile' ||
|
|
176
|
+
base.startsWith('dockerfile.') ||
|
|
177
|
+
base.startsWith('docker-compose') ||
|
|
178
|
+
base === 'jenkinsfile' ||
|
|
179
|
+
f.includes('.github/workflows')
|
|
180
|
+
);
|
|
181
|
+
})
|
|
182
|
+
: relevant;
|
|
183
|
+
|
|
184
|
+
if (filtered.length === 0) {
|
|
185
|
+
return '';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const uniquePaths = [...new Set(filtered.map(c => c.path))];
|
|
145
189
|
const lines = uniquePaths.slice(-20).map(p => {
|
|
146
190
|
const rel = path.relative(this.rootDir, p);
|
|
147
|
-
|
|
191
|
+
// Categorize for DevOps context
|
|
192
|
+
let category = '';
|
|
193
|
+
const lower = rel.toLowerCase();
|
|
194
|
+
if (lower.endsWith('.tf') || lower.endsWith('.tfvars')) category = ' [terraform]';
|
|
195
|
+
else if (lower.endsWith('.yaml') || lower.endsWith('.yml')) category = ' [yaml/k8s]';
|
|
196
|
+
else if (lower.includes('dockerfile')) category = ' [docker]';
|
|
197
|
+
return ` - ${rel}${category}`;
|
|
148
198
|
});
|
|
149
199
|
|
|
150
200
|
return `Files changed externally:\n${lines.join('\n')}`;
|
|
@@ -154,7 +204,8 @@ export class FileWatcher extends EventEmitter {
|
|
|
154
204
|
* Clear the change history.
|
|
155
205
|
*/
|
|
156
206
|
clearChanges(): void {
|
|
157
|
-
this.
|
|
207
|
+
this.changesHead = 0;
|
|
208
|
+
this.changesSize = 0;
|
|
158
209
|
}
|
|
159
210
|
|
|
160
211
|
get isWatching(): boolean {
|
package/src/wizard/types.ts
CHANGED
package/src/wizard/ui.ts
CHANGED
|
@@ -110,7 +110,7 @@ const boxChars = {
|
|
|
110
110
|
export class WizardUI {
|
|
111
111
|
private terminalWidth: number;
|
|
112
112
|
private spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
113
|
-
private spinnerInterval?:
|
|
113
|
+
private spinnerInterval?: ReturnType<typeof setTimeout>;
|
|
114
114
|
|
|
115
115
|
constructor() {
|
|
116
116
|
this.terminalWidth = process.stdout.columns || 80;
|
package/tsconfig.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"module": "ESNext",
|
|
5
5
|
"moduleResolution": "bundler",
|
|
6
6
|
"lib": ["ESNext"],
|
|
7
|
-
"types": ["
|
|
7
|
+
"types": ["node"],
|
|
8
8
|
"jsx": "react-jsx",
|
|
9
9
|
"jsxImportSource": "react",
|
|
10
10
|
"strict": true,
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
"rootDir": "."
|
|
21
21
|
},
|
|
22
22
|
"include": ["src/**/*", "scripts/**/*"],
|
|
23
|
-
"exclude": ["node_modules", "dist", "coverage", "**/node_modules", "**/dist"]
|
|
23
|
+
"exclude": ["node_modules", "dist", "coverage", "**/node_modules", "**/dist", "src/build.ts"]
|
|
24
24
|
}
|