@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,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreePane Component (L1)
|
|
3
|
+
*
|
|
4
|
+
* Collapsible file tree sidebar using box-drawing characters.
|
|
5
|
+
* Shows 2 levels deep by default; toggle via /tree slash command.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React, { useState, useEffect } from 'react';
|
|
9
|
+
import { Box, Text, useInput } from 'ink';
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
|
|
13
|
+
export interface TreePaneProps {
|
|
14
|
+
/** Root directory to display. Defaults to process.cwd(). */
|
|
15
|
+
cwd?: string;
|
|
16
|
+
/** Recently modified file paths (for highlighting). */
|
|
17
|
+
recentFiles?: string[];
|
|
18
|
+
/** Callback when user presses Enter on a file (to inject @filepath). */
|
|
19
|
+
onSelectFile?: (filePath: string) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface TreeNode {
|
|
23
|
+
name: string;
|
|
24
|
+
fullPath: string;
|
|
25
|
+
isDir: boolean;
|
|
26
|
+
children?: TreeNode[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function buildTree(dir: string, depth: number, maxDepth: number): TreeNode[] {
|
|
30
|
+
if (depth > maxDepth) return [];
|
|
31
|
+
try {
|
|
32
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
33
|
+
return entries
|
|
34
|
+
.filter(e => !e.name.startsWith('.') && e.name !== 'node_modules' && e.name !== 'dist')
|
|
35
|
+
.slice(0, 30) // limit entries per level
|
|
36
|
+
.map(e => {
|
|
37
|
+
const fullPath = path.join(dir, e.name);
|
|
38
|
+
const node: TreeNode = { name: e.name, fullPath, isDir: e.isDirectory() };
|
|
39
|
+
if (e.isDirectory() && depth < maxDepth) {
|
|
40
|
+
node.children = buildTree(fullPath, depth + 1, maxDepth);
|
|
41
|
+
}
|
|
42
|
+
return node;
|
|
43
|
+
});
|
|
44
|
+
} catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function renderTree(
|
|
50
|
+
nodes: TreeNode[],
|
|
51
|
+
prefix: string,
|
|
52
|
+
selectedIdx: number,
|
|
53
|
+
flatList: TreeNode[],
|
|
54
|
+
recentPaths: Set<string>
|
|
55
|
+
): React.ReactNode[] {
|
|
56
|
+
const elements: React.ReactNode[] = [];
|
|
57
|
+
nodes.forEach((node, i) => {
|
|
58
|
+
const isLast = i === nodes.length - 1;
|
|
59
|
+
const connector = isLast ? '└─' : '├─';
|
|
60
|
+
const childPrefix = prefix + (isLast ? ' ' : '│ ');
|
|
61
|
+
const globalIdx = flatList.indexOf(node);
|
|
62
|
+
const isSelected = globalIdx === selectedIdx;
|
|
63
|
+
const isRecent = recentPaths.has(node.fullPath);
|
|
64
|
+
|
|
65
|
+
elements.push(
|
|
66
|
+
<Text key={node.fullPath} color={isSelected ? 'cyan' : isRecent ? 'yellow' : undefined} bold={isSelected}>
|
|
67
|
+
{prefix}{connector} {node.isDir ? '[/] ' : ''}{node.name}
|
|
68
|
+
</Text>
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
if (node.children && node.children.length > 0) {
|
|
72
|
+
elements.push(...renderTree(node.children, childPrefix, selectedIdx, flatList, recentPaths));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return elements;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function flattenTree(nodes: TreeNode[]): TreeNode[] {
|
|
79
|
+
const result: TreeNode[] = [];
|
|
80
|
+
for (const node of nodes) {
|
|
81
|
+
result.push(node);
|
|
82
|
+
if (node.children) {
|
|
83
|
+
result.push(...flattenTree(node.children));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function TreePane({ cwd = process.cwd(), recentFiles = [], onSelectFile }: TreePaneProps) {
|
|
90
|
+
const [tree, setTree] = useState<TreeNode[]>([]);
|
|
91
|
+
const [selectedIdx, setSelectedIdx] = useState(0);
|
|
92
|
+
const recentPaths = new Set(recentFiles);
|
|
93
|
+
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
const nodes = buildTree(cwd, 0, 2);
|
|
96
|
+
setTree(nodes);
|
|
97
|
+
}, [cwd]);
|
|
98
|
+
|
|
99
|
+
const flat = flattenTree(tree);
|
|
100
|
+
|
|
101
|
+
useInput((input, key) => {
|
|
102
|
+
if (key.upArrow) {
|
|
103
|
+
setSelectedIdx(prev => Math.max(0, prev - 1));
|
|
104
|
+
} else if (key.downArrow) {
|
|
105
|
+
setSelectedIdx(prev => Math.min(flat.length - 1, prev + 1));
|
|
106
|
+
} else if (key.return && flat[selectedIdx]) {
|
|
107
|
+
const node = flat[selectedIdx];
|
|
108
|
+
if (!node.isDir && onSelectFile) {
|
|
109
|
+
onSelectFile(node.fullPath);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<Box
|
|
116
|
+
flexDirection="column"
|
|
117
|
+
borderStyle="single"
|
|
118
|
+
borderColor="gray"
|
|
119
|
+
paddingX={1}
|
|
120
|
+
flexShrink={0}
|
|
121
|
+
overflow="hidden"
|
|
122
|
+
>
|
|
123
|
+
<Box marginBottom={1}>
|
|
124
|
+
<Text bold color="cyan">Files</Text>
|
|
125
|
+
<Text dimColor> (↑↓ navigate · Enter to @ref · /tree to toggle)</Text>
|
|
126
|
+
</Box>
|
|
127
|
+
|
|
128
|
+
<Text bold dimColor>{path.basename(cwd)}/</Text>
|
|
129
|
+
{renderTree(tree, '', selectedIdx, flat, recentPaths)}
|
|
130
|
+
</Box>
|
|
131
|
+
);
|
|
132
|
+
}
|
package/src/ui/chat-ui.ts
CHANGED
|
@@ -28,6 +28,8 @@ import {
|
|
|
28
28
|
approveActionForSession,
|
|
29
29
|
type PermissionSessionState,
|
|
30
30
|
} from '../agent/permissions';
|
|
31
|
+
import { buildSystemPrompt } from '../agent/system-prompt';
|
|
32
|
+
import { expandFileReferences } from '../agent/expand-files';
|
|
31
33
|
|
|
32
34
|
/**
|
|
33
35
|
* Simple code block highlighter for terminal display.
|
|
@@ -149,13 +151,16 @@ export class ChatUI {
|
|
|
149
151
|
// Session persistence is non-critical
|
|
150
152
|
}
|
|
151
153
|
|
|
152
|
-
// Add system prompt to history
|
|
153
|
-
|
|
154
|
-
this.
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
154
|
+
// Add system prompt to history (use buildSystemPrompt for full DevOps context)
|
|
155
|
+
const systemPromptContent = options.systemPrompt ?? buildSystemPrompt({
|
|
156
|
+
mode: this.currentMode,
|
|
157
|
+
tools: defaultToolRegistry.getAll(),
|
|
158
|
+
cwd: process.cwd(),
|
|
159
|
+
});
|
|
160
|
+
this.history.push({
|
|
161
|
+
role: 'system',
|
|
162
|
+
content: systemPromptContent,
|
|
163
|
+
});
|
|
159
164
|
}
|
|
160
165
|
|
|
161
166
|
/**
|
|
@@ -394,11 +399,11 @@ export class ChatUI {
|
|
|
394
399
|
}
|
|
395
400
|
|
|
396
401
|
private getPersonaSystemPrompt(tone: PersonaTone): string {
|
|
397
|
-
const baseIdentity = `You are Nimbus, an AI-powered
|
|
402
|
+
const baseIdentity = `You are Nimbus, an AI-powered DevOps engineering agent. You help users with:
|
|
398
403
|
|
|
399
|
-
- Infrastructure as Code (Terraform,
|
|
400
|
-
- Kubernetes operations and configurations
|
|
404
|
+
- Infrastructure as Code (Terraform, Kubernetes, Helm)
|
|
401
405
|
- Cloud provider operations (AWS, GCP, Azure)
|
|
406
|
+
- Kubernetes operations and configurations
|
|
402
407
|
- Helm chart management and deployment
|
|
403
408
|
- DevOps best practices and CI/CD pipelines
|
|
404
409
|
- Troubleshooting infrastructure issues`;
|
|
@@ -514,39 +519,12 @@ export class ChatUI {
|
|
|
514
519
|
});
|
|
515
520
|
}
|
|
516
521
|
|
|
517
|
-
/**
|
|
518
|
-
* Expand @path/to/file references in text with file contents.
|
|
519
|
-
*/
|
|
520
|
-
private expandFileReferences(text: string): string {
|
|
521
|
-
const fileRefs = text.match(/@([\w./_-]+)/g);
|
|
522
|
-
if (!fileRefs) {
|
|
523
|
-
return text;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
let expanded = text;
|
|
527
|
-
for (const ref of fileRefs) {
|
|
528
|
-
const filePath = ref.slice(1);
|
|
529
|
-
try {
|
|
530
|
-
const resolved = path.resolve(process.cwd(), filePath);
|
|
531
|
-
const content = fs.readFileSync(resolved, 'utf-8');
|
|
532
|
-
const truncated =
|
|
533
|
-
content.length > 10000
|
|
534
|
-
? `${content.slice(0, 10000)}\n... (truncated — showing 10,000 of ${content.length.toLocaleString()} chars)`
|
|
535
|
-
: content;
|
|
536
|
-
expanded = expanded.replace(ref, `\n<file path="${filePath}">\n${truncated}\n</file>`);
|
|
537
|
-
} catch {
|
|
538
|
-
// File not found — leave the @reference as-is
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
return expanded;
|
|
542
|
-
}
|
|
543
|
-
|
|
544
522
|
private async sendMessage(userMessage: string): Promise<void> {
|
|
545
523
|
this.isProcessing = true;
|
|
546
524
|
this.abortController = new AbortController();
|
|
547
525
|
|
|
548
|
-
// Expand @file references
|
|
549
|
-
const expandedMessage =
|
|
526
|
+
// Expand @file references using the shared module
|
|
527
|
+
const expandedMessage = expandFileReferences(userMessage, process.cwd());
|
|
550
528
|
|
|
551
529
|
// Add user message to display history
|
|
552
530
|
this.history.push({
|
|
@@ -556,8 +534,15 @@ export class ChatUI {
|
|
|
556
534
|
|
|
557
535
|
ui.newLine();
|
|
558
536
|
|
|
559
|
-
//
|
|
560
|
-
|
|
537
|
+
// Animated spinner until the first text chunk arrives
|
|
538
|
+
const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
539
|
+
let spinnerIdx = 0;
|
|
540
|
+
let spinnerCleared = false;
|
|
541
|
+
const spinnerInterval = setInterval(() => {
|
|
542
|
+
if (!spinnerCleared) {
|
|
543
|
+
process.stderr.write(`\r${spinnerFrames[spinnerIdx++ % spinnerFrames.length]} Thinking...`);
|
|
544
|
+
}
|
|
545
|
+
}, 80);
|
|
561
546
|
let thinkingCleared = false;
|
|
562
547
|
const clearThinking = () => {
|
|
563
548
|
if (!thinkingCleared) {
|
|
@@ -566,6 +551,13 @@ export class ChatUI {
|
|
|
566
551
|
process.stdout.write('\r\x1b[K');
|
|
567
552
|
}
|
|
568
553
|
};
|
|
554
|
+
const clearSpinner = () => {
|
|
555
|
+
if (!spinnerCleared) {
|
|
556
|
+
spinnerCleared = true;
|
|
557
|
+
clearInterval(spinnerInterval);
|
|
558
|
+
process.stderr.write('\r\x1b[K'); // clear spinner line
|
|
559
|
+
}
|
|
560
|
+
};
|
|
569
561
|
|
|
570
562
|
let fullResponse = '';
|
|
571
563
|
let tokenCount = 0;
|
|
@@ -586,6 +578,7 @@ export class ChatUI {
|
|
|
586
578
|
sessionId: this.sessionId || undefined,
|
|
587
579
|
|
|
588
580
|
onText: text => {
|
|
581
|
+
clearSpinner();
|
|
589
582
|
clearThinking();
|
|
590
583
|
if (!textStarted) {
|
|
591
584
|
process.stdout.write(ui.color('Nimbus: ', 'blue'));
|
|
@@ -639,6 +632,10 @@ export class ChatUI {
|
|
|
639
632
|
},
|
|
640
633
|
});
|
|
641
634
|
|
|
635
|
+
// Ensure spinner and thinking indicator are cleared
|
|
636
|
+
clearSpinner();
|
|
637
|
+
clearThinking();
|
|
638
|
+
|
|
642
639
|
// Ensure we end the text output
|
|
643
640
|
if (textStarted) {
|
|
644
641
|
process.stdout.write('\n');
|
|
@@ -648,11 +645,10 @@ export class ChatUI {
|
|
|
648
645
|
this.agentHistory = result.messages;
|
|
649
646
|
tokenCount = result.usage.totalTokens;
|
|
650
647
|
|
|
651
|
-
// Persist conversation to SQLite
|
|
648
|
+
// Persist conversation + stats atomically to SQLite
|
|
652
649
|
if (this.sessionManager && this.sessionId) {
|
|
653
650
|
try {
|
|
654
|
-
this.sessionManager.
|
|
655
|
-
this.sessionManager.updateSession(this.sessionId, {
|
|
651
|
+
this.sessionManager.saveConversationAndStats(this.sessionId, this.agentHistory, {
|
|
656
652
|
tokenCount: result.usage.totalTokens,
|
|
657
653
|
costUSD: result.totalCost,
|
|
658
654
|
});
|
|
@@ -704,6 +700,7 @@ export class ChatUI {
|
|
|
704
700
|
ui.info('Operation interrupted.');
|
|
705
701
|
}
|
|
706
702
|
} catch (error: any) {
|
|
703
|
+
clearSpinner();
|
|
707
704
|
clearThinking();
|
|
708
705
|
if (textStarted) {
|
|
709
706
|
process.stdout.write('\n');
|