@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/InputBox.tsx
CHANGED
|
@@ -13,29 +13,81 @@
|
|
|
13
13
|
* - Reverse search (Ctrl+R) through history
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import React, { useState, useCallback, useRef } from 'react';
|
|
16
|
+
import React, { useState, useCallback, useRef, useEffect } from 'react';
|
|
17
17
|
import { Box, Text, useInput } from 'ink';
|
|
18
18
|
import TextInput from 'ink-text-input';
|
|
19
|
+
import { spawnSync } from 'node:child_process';
|
|
20
|
+
import { writeFileSync, readFileSync, unlinkSync, existsSync, mkdirSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { homedir } from 'node:os';
|
|
19
23
|
|
|
20
24
|
/** Maximum number of history entries to keep. */
|
|
21
25
|
const MAX_HISTORY = 100;
|
|
22
26
|
|
|
27
|
+
/** Path to the persistent input history file. */
|
|
28
|
+
const HISTORY_FILE = join(homedir(), '.nimbus', 'input-history.json');
|
|
29
|
+
|
|
30
|
+
/** Load persisted input history from disk (returns [] on any error). */
|
|
31
|
+
function loadHistory(): string[] {
|
|
32
|
+
try {
|
|
33
|
+
if (!existsSync(HISTORY_FILE)) return [];
|
|
34
|
+
const raw = readFileSync(HISTORY_FILE, 'utf-8');
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
if (Array.isArray(parsed)) return parsed.slice(-MAX_HISTORY) as string[];
|
|
37
|
+
} catch { /* ignore */ }
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Save input history to disk (fire-and-forget, ignores errors). */
|
|
42
|
+
function saveHistory(entries: string[]): void {
|
|
43
|
+
try {
|
|
44
|
+
const dir = join(homedir(), '.nimbus');
|
|
45
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
46
|
+
writeFileSync(HISTORY_FILE, JSON.stringify(entries.slice(-MAX_HISTORY)), 'utf-8');
|
|
47
|
+
} catch { /* non-critical */ }
|
|
48
|
+
}
|
|
49
|
+
|
|
23
50
|
/** All recognized slash commands for autocomplete. */
|
|
24
51
|
const SLASH_COMMANDS = [
|
|
52
|
+
'/alias',
|
|
53
|
+
'/apply',
|
|
54
|
+
'/branch',
|
|
55
|
+
'/auth-refresh',
|
|
25
56
|
'/clear',
|
|
26
57
|
'/compact',
|
|
27
58
|
'/context',
|
|
59
|
+
'/cost',
|
|
60
|
+
'/diff',
|
|
61
|
+
'/drift',
|
|
62
|
+
'/explain',
|
|
63
|
+
'/export',
|
|
28
64
|
'/help',
|
|
65
|
+
'/init',
|
|
66
|
+
'/k8s-ctx',
|
|
29
67
|
'/model',
|
|
30
68
|
'/models',
|
|
31
69
|
'/mode',
|
|
32
70
|
'/new',
|
|
71
|
+
'/plan',
|
|
72
|
+
'/profile',
|
|
33
73
|
'/redo',
|
|
74
|
+
'/rollback',
|
|
75
|
+
'/search',
|
|
34
76
|
'/sessions',
|
|
35
77
|
'/switch',
|
|
78
|
+
'/terminal',
|
|
79
|
+
'/tf-ws',
|
|
80
|
+
'/theme',
|
|
81
|
+
'/tools',
|
|
82
|
+
'/tree',
|
|
36
83
|
'/undo',
|
|
84
|
+
'/watch',
|
|
85
|
+
'/workspace',
|
|
37
86
|
];
|
|
38
87
|
|
|
88
|
+
/** L1: Known subagent names for @agent completions. */
|
|
89
|
+
const AGENT_NAMES = ['explore', 'infra', 'security', 'cost', 'general'];
|
|
90
|
+
|
|
39
91
|
/** Props accepted by the InputBox component. */
|
|
40
92
|
export interface InputBoxProps {
|
|
41
93
|
/** Called when the user presses Enter with non-empty input. */
|
|
@@ -46,6 +98,14 @@ export interface InputBoxProps {
|
|
|
46
98
|
placeholder?: string;
|
|
47
99
|
/** Whether the input is disabled (e.g. while the agent is processing). */
|
|
48
100
|
disabled?: boolean;
|
|
101
|
+
/** Current agent mode — controls prompt character and color (Gap 11). */
|
|
102
|
+
mode?: 'plan' | 'build' | 'deploy';
|
|
103
|
+
/** Called when the input line count changes (for StatusBar multi-line indicator). */
|
|
104
|
+
onLineCountChange?: (count: number) => void;
|
|
105
|
+
/** GAP-21: Pre-fill the input with this text (e.g. @filepath from TreePane). */
|
|
106
|
+
prefill?: string;
|
|
107
|
+
/** H3: Fetch dynamic completions for slash command arguments (e.g. /k8s-ctx, /tf-ws). */
|
|
108
|
+
onFetchCompletions?: (prefix: string) => Promise<string[]>;
|
|
49
109
|
}
|
|
50
110
|
|
|
51
111
|
/**
|
|
@@ -54,16 +114,31 @@ export interface InputBoxProps {
|
|
|
54
114
|
* fires the optional onAbort callback. Up/Down arrows navigate history.
|
|
55
115
|
* Tab autocompletes slash commands. Ctrl+R opens reverse search.
|
|
56
116
|
*/
|
|
57
|
-
export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: InputBoxProps) {
|
|
58
|
-
const [value, setValue] = useState('') as [string, React.Dispatch<React.SetStateAction<string>>];
|
|
117
|
+
export function InputBox({ onSubmit, onAbort, placeholder, disabled = false, mode = 'build', onLineCountChange, prefill, onFetchCompletions }: InputBoxProps) {
|
|
118
|
+
const [value, setValue] = useState(prefill ?? '') as [string, React.Dispatch<React.SetStateAction<string>>];
|
|
119
|
+
// GAP-21: When prefill changes externally, update the input value
|
|
120
|
+
const prevPrefill = useRef(prefill);
|
|
121
|
+
if (prefill !== prevPrefill.current) {
|
|
122
|
+
prevPrefill.current = prefill;
|
|
123
|
+
if (prefill !== undefined) {
|
|
124
|
+
setValue(prefill);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
59
127
|
|
|
60
|
-
// History: most recent entry is at the end
|
|
61
|
-
const history = useRef<string[]>(
|
|
128
|
+
// History: most recent entry is at the end (C1: loaded from disk)
|
|
129
|
+
const history = useRef<string[]>(loadHistory());
|
|
62
130
|
// -1 means "not browsing history" (showing current draft)
|
|
63
131
|
const historyIndex = useRef(-1);
|
|
64
132
|
// Stores the in-progress text before the user started browsing history
|
|
65
133
|
const draft = useRef('');
|
|
66
134
|
|
|
135
|
+
// C1: Persist history to disk on unmount
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
return () => {
|
|
138
|
+
saveHistory(history.current);
|
|
139
|
+
};
|
|
140
|
+
}, []);
|
|
141
|
+
|
|
67
142
|
// Slash command autocomplete state
|
|
68
143
|
const [slashHint, setSlashHint] = useState('');
|
|
69
144
|
const suggestionIndex = useRef(0);
|
|
@@ -74,6 +149,13 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
74
149
|
const [fileHint, setFileHint] = useState('');
|
|
75
150
|
const fileSuggestionIndex = useRef(0);
|
|
76
151
|
|
|
152
|
+
// H3: Dynamic completions for slash command arguments
|
|
153
|
+
const [dynamicSuggestions, setDynamicSuggestions] = useState<string[]>([]);
|
|
154
|
+
const [dynamicHint, setDynamicHint] = useState('');
|
|
155
|
+
const dynamicSuggestionIndex = useRef(0);
|
|
156
|
+
// Cache: prefix → {items, ts}
|
|
157
|
+
const dynamicCache = useRef<Map<string, { items: string[]; ts: number }>>(new Map());
|
|
158
|
+
|
|
77
159
|
// Ctrl+R search mode
|
|
78
160
|
const [searchMode, setSearchMode] = useState(false);
|
|
79
161
|
const [searchQuery, setSearchQuery] = useState('');
|
|
@@ -94,6 +176,8 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
94
176
|
if (h.length > MAX_HISTORY) {
|
|
95
177
|
h.shift();
|
|
96
178
|
}
|
|
179
|
+
// C1: Persist to disk on every new entry
|
|
180
|
+
saveHistory(h);
|
|
97
181
|
}
|
|
98
182
|
|
|
99
183
|
// Reset history navigation
|
|
@@ -108,6 +192,22 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
108
192
|
// Handle Escape, Up/Down arrows, Tab autocomplete, Ctrl+R
|
|
109
193
|
useInput(
|
|
110
194
|
(input, key) => {
|
|
195
|
+
// --- Ctrl+E: open $EDITOR for multi-line input composition (Gap 3) ---
|
|
196
|
+
if (input === 'e' && key.ctrl) {
|
|
197
|
+
const editor = process.env.EDITOR ?? process.env.VISUAL ?? 'nano';
|
|
198
|
+
const tmpFile = `/tmp/nimbus-input-${Date.now()}.md`;
|
|
199
|
+
try {
|
|
200
|
+
writeFileSync(tmpFile, value, 'utf-8');
|
|
201
|
+
spawnSync(editor, [tmpFile], { stdio: 'inherit' });
|
|
202
|
+
const edited = readFileSync(tmpFile, 'utf-8');
|
|
203
|
+
try { unlinkSync(tmpFile); } catch { /* ignore */ }
|
|
204
|
+
setValue(edited);
|
|
205
|
+
} catch {
|
|
206
|
+
/* editor not available — ignore */
|
|
207
|
+
}
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
111
211
|
// --- Ctrl+R: toggle search mode ---
|
|
112
212
|
if (input === 'r' && key.ctrl) {
|
|
113
213
|
if (!searchMode) {
|
|
@@ -158,6 +258,43 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
158
258
|
|
|
159
259
|
// Slash command completion
|
|
160
260
|
if (value.startsWith('/')) {
|
|
261
|
+
// H3: Dynamic argument completions for /k8s-ctx, /tf-ws, /model, /profile
|
|
262
|
+
const dynamicPrefixes = ['/k8s-ctx ', '/tf-ws ', '/model ', '/profile '];
|
|
263
|
+
const dynMatch = dynamicPrefixes.find(p => value.startsWith(p));
|
|
264
|
+
if (dynMatch && onFetchCompletions) {
|
|
265
|
+
const partial = value.slice(dynMatch.length);
|
|
266
|
+
// Cycle through already-fetched suggestions
|
|
267
|
+
if (dynamicSuggestions.length > 0) {
|
|
268
|
+
const filtered = partial ? dynamicSuggestions.filter(s => s.startsWith(partial)) : dynamicSuggestions;
|
|
269
|
+
if (filtered.length > 0) {
|
|
270
|
+
const idx = dynamicSuggestionIndex.current % filtered.length;
|
|
271
|
+
setValue(`${dynMatch}${filtered[idx]}`);
|
|
272
|
+
dynamicSuggestionIndex.current = idx + 1;
|
|
273
|
+
setDynamicHint(`[${filtered.length} options, Tab to cycle]`);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Fetch completions (non-blocking, cache 30s)
|
|
278
|
+
const cacheKey = dynMatch;
|
|
279
|
+
const cached = dynamicCache.current.get(cacheKey);
|
|
280
|
+
const CACHE_TTL = 30_000;
|
|
281
|
+
if (!cached || Date.now() - cached.ts > CACHE_TTL) {
|
|
282
|
+
onFetchCompletions(value).then(items => {
|
|
283
|
+
dynamicCache.current.set(cacheKey, { items, ts: Date.now() });
|
|
284
|
+
setDynamicSuggestions(items);
|
|
285
|
+
dynamicSuggestionIndex.current = 0;
|
|
286
|
+
if (items.length > 0) {
|
|
287
|
+
setValue(`${dynMatch}${items[0]}`);
|
|
288
|
+
setDynamicHint(`[${items.length} options, Tab to cycle]`);
|
|
289
|
+
}
|
|
290
|
+
}).catch(() => { /* ignore */ });
|
|
291
|
+
} else {
|
|
292
|
+
setDynamicSuggestions(cached.items);
|
|
293
|
+
dynamicSuggestionIndex.current = 0;
|
|
294
|
+
}
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
161
298
|
const prefix = value.toLowerCase();
|
|
162
299
|
const matches = SLASH_COMMANDS.filter(cmd => cmd.startsWith(prefix));
|
|
163
300
|
if (matches.length === 0) {
|
|
@@ -286,16 +423,23 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
286
423
|
);
|
|
287
424
|
}
|
|
288
425
|
|
|
426
|
+
// Gap 11: mode-specific prompt character and color
|
|
427
|
+
const promptLabel = mode === 'plan' ? '[plan]> ' : mode === 'deploy' ? '[DEPLOY]> ' : '[build]> ';
|
|
428
|
+
const promptColor = mode === 'plan' ? 'blue' : mode === 'deploy' ? 'red' : 'green';
|
|
429
|
+
|
|
289
430
|
// --- Normal input UI ---
|
|
290
431
|
return (
|
|
291
432
|
<Box paddingX={1}>
|
|
292
|
-
<Text bold color=
|
|
293
|
-
{
|
|
433
|
+
<Text bold color={promptColor}>
|
|
434
|
+
{promptLabel}
|
|
294
435
|
</Text>
|
|
295
436
|
<TextInput
|
|
296
437
|
value={value}
|
|
297
438
|
onChange={v => {
|
|
298
|
-
|
|
439
|
+
// L2: Guard against large paste (>10KB) which would freeze the Ink UI
|
|
440
|
+
const safeV = v.length > 10_000 ? v.slice(0, 10_000) : v;
|
|
441
|
+
setValue(safeV);
|
|
442
|
+
onLineCountChange?.(safeV.split('\n').length);
|
|
299
443
|
// If user types while browsing history, exit history mode
|
|
300
444
|
if (historyIndex.current !== -1) {
|
|
301
445
|
historyIndex.current = -1;
|
|
@@ -305,10 +449,17 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
305
449
|
setSlashHint('');
|
|
306
450
|
lastSuggestions.current = [];
|
|
307
451
|
}
|
|
308
|
-
// @file mention detection
|
|
452
|
+
// @file / @agent mention detection
|
|
309
453
|
const atMatch = v.match(/@(\S*)$/);
|
|
310
454
|
if (atMatch) {
|
|
311
455
|
const partial = atMatch[1];
|
|
456
|
+
// L1: Try agent names first
|
|
457
|
+
const agentMatches = AGENT_NAMES.filter(a => a.startsWith(partial.toLowerCase()));
|
|
458
|
+
if (agentMatches.length > 0 && partial.length > 0) {
|
|
459
|
+
setFileSuggestions(agentMatches.map(a => `@${a} `));
|
|
460
|
+
fileSuggestionIndex.current = 0;
|
|
461
|
+
setFileHint(`[${agentMatches.length} agent${agentMatches.length > 1 ? 's' : ''}, Tab to complete]`);
|
|
462
|
+
} else {
|
|
312
463
|
try {
|
|
313
464
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
314
465
|
const fs = require('node:fs');
|
|
@@ -332,6 +483,7 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
332
483
|
setFileSuggestions([]);
|
|
333
484
|
setFileHint('');
|
|
334
485
|
}
|
|
486
|
+
}
|
|
335
487
|
} else {
|
|
336
488
|
if (fileSuggestions.length > 0) {
|
|
337
489
|
setFileSuggestions([]);
|
|
@@ -340,11 +492,12 @@ export function InputBox({ onSubmit, onAbort, placeholder, disabled = false }: I
|
|
|
340
492
|
}
|
|
341
493
|
}}
|
|
342
494
|
onSubmit={handleSubmit}
|
|
343
|
-
placeholder={placeholder ?? 'Type a
|
|
495
|
+
placeholder={placeholder ?? 'Type a DevOps command... (e.g. "terraform plan", "check pods", "list releases")'}
|
|
344
496
|
/>
|
|
345
497
|
{isMultiLine && <Text color="cyan">{` [${lineCount} lines]`}</Text>}
|
|
346
498
|
{slashHint && <Text dimColor>{` ${slashHint}`}</Text>}
|
|
347
499
|
{fileHint && <Text dimColor>{` ${fileHint}`}</Text>}
|
|
500
|
+
{dynamicHint && <Text dimColor>{` ${dynamicHint}`}</Text>}
|
|
348
501
|
</Box>
|
|
349
502
|
);
|
|
350
503
|
}
|