@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/dist/src/app.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Lifecycle
|
|
3
|
+
*
|
|
4
|
+
* Handles initialization and shutdown of the embedded Nimbus application.
|
|
5
|
+
* Lazily initializes the SQLite database and the LLM router.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdirSync, existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
/** The resolved path to ~/.nimbus */
|
|
11
|
+
const NIMBUS_DIR = join(homedir(), '.nimbus');
|
|
12
|
+
/** Holds the initialized app context, or null if not yet initialized. */
|
|
13
|
+
let appContext = null;
|
|
14
|
+
/**
|
|
15
|
+
* Startup warnings collected during initApp() — surfaced as first system
|
|
16
|
+
* message when the TUI starts (Gap 19).
|
|
17
|
+
*/
|
|
18
|
+
export let startupWarnings = [];
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the Nimbus application.
|
|
21
|
+
*
|
|
22
|
+
* - Ensures the ~/.nimbus directory exists.
|
|
23
|
+
* - Opens (or creates) the local SQLite database via the state module.
|
|
24
|
+
* - Loads config and creates the LLM router instance.
|
|
25
|
+
* - Runs pre-flight health checks and exits on critical failures (Gap 19).
|
|
26
|
+
*
|
|
27
|
+
* This function is lazy: calling it multiple times returns the same context.
|
|
28
|
+
*/
|
|
29
|
+
export async function initApp() {
|
|
30
|
+
if (appContext) {
|
|
31
|
+
return appContext;
|
|
32
|
+
}
|
|
33
|
+
// Gap 19: Pre-flight startup checks (fast, no network calls)
|
|
34
|
+
try {
|
|
35
|
+
const { runStartupChecks } = await import('./commands/doctor');
|
|
36
|
+
const issues = await runStartupChecks();
|
|
37
|
+
if (issues.critical.length > 0) {
|
|
38
|
+
const lines = [
|
|
39
|
+
'\x1b[31m\x1b[1mNimbus cannot start:\x1b[0m',
|
|
40
|
+
...issues.critical.map(i => ` \x1b[31m✗ ${i}\x1b[0m`),
|
|
41
|
+
'',
|
|
42
|
+
'\x1b[2mRun `nimbus doctor` for detailed diagnosis.\x1b[0m',
|
|
43
|
+
];
|
|
44
|
+
process.stderr.write(lines.join('\n') + '\n');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
startupWarnings = issues.warnings;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Startup checks are non-critical — never let them block startup
|
|
51
|
+
}
|
|
52
|
+
// H2: Warn if no NIMBUS.md found in the current project directory
|
|
53
|
+
try {
|
|
54
|
+
const cwd = process.cwd();
|
|
55
|
+
const nimbusMdPaths = [join(cwd, 'NIMBUS.md'), join(cwd, '.nimbus', 'NIMBUS.md')];
|
|
56
|
+
if (!nimbusMdPaths.some(p => existsSync(p))) {
|
|
57
|
+
startupWarnings.push('No NIMBUS.md found — run /init to set up project context for better results.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Non-critical
|
|
62
|
+
}
|
|
63
|
+
// M3: Load per-project config and surface protected environments as warnings
|
|
64
|
+
try {
|
|
65
|
+
const { loadProjectConfig } = await import('./config/types');
|
|
66
|
+
const projectConfig = loadProjectConfig(process.cwd());
|
|
67
|
+
if (projectConfig?.protectedEnvironments && projectConfig.protectedEnvironments.length > 0) {
|
|
68
|
+
startupWarnings.push(`Protected environments: ${projectConfig.protectedEnvironments.join(', ')} — destructive operations require confirmation.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Non-critical
|
|
73
|
+
}
|
|
74
|
+
// Ensure ~/.nimbus directory exists
|
|
75
|
+
if (!existsSync(NIMBUS_DIR)) {
|
|
76
|
+
mkdirSync(NIMBUS_DIR, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
// Initialize the SQLite database
|
|
79
|
+
const { getDb } = await import('./state/db');
|
|
80
|
+
const db = getDb();
|
|
81
|
+
// Load LLM config and create router
|
|
82
|
+
const { loadLLMConfig } = await import('./llm/config-loader');
|
|
83
|
+
const { LLMRouter: LLMRouterClass } = await import('./llm/router');
|
|
84
|
+
const llmConfig = loadLLMConfig();
|
|
85
|
+
const router = new LLMRouterClass(llmConfig);
|
|
86
|
+
// Register all built-in tools into the global registry
|
|
87
|
+
const { defaultToolRegistry } = await import('./tools/schemas/types');
|
|
88
|
+
if (defaultToolRegistry.size === 0) {
|
|
89
|
+
const { standardTools } = await import('./tools/schemas/standard');
|
|
90
|
+
const { devopsTools } = await import('./tools/schemas/devops');
|
|
91
|
+
for (const tool of [...standardTools, ...devopsTools]) {
|
|
92
|
+
try {
|
|
93
|
+
defaultToolRegistry.register(tool);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* skip duplicates */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Connect MCP servers and register their tools (non-critical)
|
|
101
|
+
try {
|
|
102
|
+
const { MCPManager } = await import('./mcp/manager');
|
|
103
|
+
const mcpManager = new MCPManager();
|
|
104
|
+
await mcpManager.loadConfig(process.cwd());
|
|
105
|
+
if (mcpManager.serverCount > 0) {
|
|
106
|
+
await mcpManager.connectAll();
|
|
107
|
+
mcpManager.registerTools(defaultToolRegistry);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (mcpErr) {
|
|
111
|
+
// MCP is non-critical — tools work fine without it, but warn the user
|
|
112
|
+
const msg = mcpErr instanceof Error ? mcpErr.message : String(mcpErr);
|
|
113
|
+
if (process.stderr.isTTY) {
|
|
114
|
+
process.stderr.write(`\x1b[33m Warning: MCP server loading failed: ${msg}. External tools from .mcp.json will not be available.\x1b[0m\n`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
appContext = { db, router, nimbusDir: NIMBUS_DIR };
|
|
118
|
+
return appContext;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the current app context without initializing.
|
|
122
|
+
* Returns null if initApp() has not been called yet.
|
|
123
|
+
*/
|
|
124
|
+
export function getAppContext() {
|
|
125
|
+
return appContext;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Gracefully shut down the Nimbus application.
|
|
129
|
+
*
|
|
130
|
+
* Closes the database connection and clears the cached context so that
|
|
131
|
+
* a subsequent call to initApp() will re-initialize from scratch.
|
|
132
|
+
*/
|
|
133
|
+
export async function shutdownApp() {
|
|
134
|
+
if (!appContext) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Flush any pending debounced SQLite writes before closing the DB
|
|
138
|
+
try {
|
|
139
|
+
const { SessionManager } = await import('./sessions/manager');
|
|
140
|
+
SessionManager.getInstance().flushAll();
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// SessionManager may not have been used — ignore
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
appContext.db.close();
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// Database may already be closed; ignore.
|
|
150
|
+
}
|
|
151
|
+
appContext = null;
|
|
152
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activity Log - Record and query every tool call executed by the Nimbus agent.
|
|
3
|
+
*
|
|
4
|
+
* Each entry captures the tool name, input parameters, output, duration,
|
|
5
|
+
* session context, and operating mode (plan/build/deploy). The log supports
|
|
6
|
+
* flexible filtering, summary statistics with tool-level breakdowns, and
|
|
7
|
+
* both concise and verbose text formatting.
|
|
8
|
+
*/
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Helpers
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Format a duration in milliseconds as a human-friendly string.
|
|
14
|
+
*/
|
|
15
|
+
function formatDuration(ms) {
|
|
16
|
+
if (ms < 1000) {
|
|
17
|
+
return `${ms}ms`;
|
|
18
|
+
}
|
|
19
|
+
if (ms < 60_000) {
|
|
20
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
21
|
+
}
|
|
22
|
+
const minutes = Math.floor(ms / 60_000);
|
|
23
|
+
const seconds = ((ms % 60_000) / 1000).toFixed(0);
|
|
24
|
+
return `${minutes}m ${seconds}s`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format a Date as a compact ISO-like timestamp (YYYY-MM-DD HH:MM:SS).
|
|
28
|
+
*/
|
|
29
|
+
function formatTimestamp(date) {
|
|
30
|
+
const y = date.getFullYear();
|
|
31
|
+
const mo = String(date.getMonth() + 1).padStart(2, '0');
|
|
32
|
+
const d = String(date.getDate()).padStart(2, '0');
|
|
33
|
+
const h = String(date.getHours()).padStart(2, '0');
|
|
34
|
+
const mi = String(date.getMinutes()).padStart(2, '0');
|
|
35
|
+
const s = String(date.getSeconds()).padStart(2, '0');
|
|
36
|
+
return `${y}-${mo}-${d} ${h}:${mi}:${s}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Truncate a string to maxLen characters, appending an ellipsis if needed.
|
|
40
|
+
*/
|
|
41
|
+
function truncate(str, maxLen) {
|
|
42
|
+
if (str.length <= maxLen) {
|
|
43
|
+
return str;
|
|
44
|
+
}
|
|
45
|
+
return `${str.slice(0, maxLen - 3)}...`;
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// ActivityLog
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* In-memory log of all tool calls made during Nimbus sessions.
|
|
52
|
+
*
|
|
53
|
+
* Supports recording entries, querying with filters, computing summary
|
|
54
|
+
* statistics, and formatting output for display in the CLI.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const log = new ActivityLog();
|
|
59
|
+
*
|
|
60
|
+
* log.log({
|
|
61
|
+
* timestamp: new Date(),
|
|
62
|
+
* sessionId: 'session-1',
|
|
63
|
+
* toolName: 'terraform_plan',
|
|
64
|
+
* toolInput: { dir: '/infra' },
|
|
65
|
+
* result: { output: 'Plan: 3 to add', isError: false },
|
|
66
|
+
* duration: 4200,
|
|
67
|
+
* mode: 'plan',
|
|
68
|
+
* });
|
|
69
|
+
*
|
|
70
|
+
* const entries = log.query({ toolName: 'terraform_plan' });
|
|
71
|
+
* console.log(log.formatLog(entries));
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export class ActivityLog {
|
|
75
|
+
entries = [];
|
|
76
|
+
/**
|
|
77
|
+
* Record a tool call in the activity log.
|
|
78
|
+
*
|
|
79
|
+
* A unique ID is generated automatically. The entry is appended to the
|
|
80
|
+
* internal ledger and returned.
|
|
81
|
+
*
|
|
82
|
+
* @param entry - All fields except `id` (which is auto-generated)
|
|
83
|
+
* @returns The created activity entry with its assigned ID
|
|
84
|
+
*/
|
|
85
|
+
log(entry) {
|
|
86
|
+
const full = {
|
|
87
|
+
id: crypto.randomUUID(),
|
|
88
|
+
...entry,
|
|
89
|
+
};
|
|
90
|
+
this.entries.push(full);
|
|
91
|
+
return full;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Query the activity log with optional filters.
|
|
95
|
+
*
|
|
96
|
+
* Filters are combined with AND logic. Results are returned in reverse
|
|
97
|
+
* chronological order (newest first). Use `limit` to cap the result count.
|
|
98
|
+
*
|
|
99
|
+
* @param filter - Optional filter criteria
|
|
100
|
+
* @returns Matching activity entries
|
|
101
|
+
*/
|
|
102
|
+
query(filter) {
|
|
103
|
+
let results = [...this.entries];
|
|
104
|
+
if (filter?.toolName) {
|
|
105
|
+
results = results.filter(e => e.toolName === filter.toolName);
|
|
106
|
+
}
|
|
107
|
+
if (filter?.sessionId) {
|
|
108
|
+
results = results.filter(e => e.sessionId === filter.sessionId);
|
|
109
|
+
}
|
|
110
|
+
if (filter?.since) {
|
|
111
|
+
const since = filter.since.getTime();
|
|
112
|
+
results = results.filter(e => e.timestamp.getTime() >= since);
|
|
113
|
+
}
|
|
114
|
+
if (filter?.until) {
|
|
115
|
+
const until = filter.until.getTime();
|
|
116
|
+
results = results.filter(e => e.timestamp.getTime() <= until);
|
|
117
|
+
}
|
|
118
|
+
if (filter?.isError !== undefined) {
|
|
119
|
+
results = results.filter(e => e.result.isError === filter.isError);
|
|
120
|
+
}
|
|
121
|
+
// Sort newest first
|
|
122
|
+
results.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
|
|
123
|
+
if (filter?.limit !== undefined && filter.limit > 0) {
|
|
124
|
+
results = results.slice(0, filter.limit);
|
|
125
|
+
}
|
|
126
|
+
return results;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Compute summary statistics for the activity log.
|
|
130
|
+
*
|
|
131
|
+
* Returns total call count, error count, average duration, and a breakdown
|
|
132
|
+
* of call counts per tool name.
|
|
133
|
+
*
|
|
134
|
+
* @param sessionId - If provided, restrict statistics to this session
|
|
135
|
+
* @returns Summary statistics object
|
|
136
|
+
*/
|
|
137
|
+
getStats(sessionId) {
|
|
138
|
+
let entries = this.entries;
|
|
139
|
+
if (sessionId) {
|
|
140
|
+
entries = entries.filter(e => e.sessionId === sessionId);
|
|
141
|
+
}
|
|
142
|
+
const totalCalls = entries.length;
|
|
143
|
+
const errorCount = entries.filter(e => e.result.isError).length;
|
|
144
|
+
const totalDuration = entries.reduce((sum, e) => sum + e.duration, 0);
|
|
145
|
+
const avgDuration = totalCalls > 0 ? Math.round(totalDuration / totalCalls) : 0;
|
|
146
|
+
const toolBreakdown = {};
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
toolBreakdown[entry.toolName] = (toolBreakdown[entry.toolName] ?? 0) + 1;
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
totalCalls,
|
|
152
|
+
errorCount,
|
|
153
|
+
avgDuration,
|
|
154
|
+
toolBreakdown,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Format activity entries as a human-readable text report.
|
|
159
|
+
*
|
|
160
|
+
* In concise mode (default), each entry is a single line with timestamp,
|
|
161
|
+
* tool name, duration, and status. In verbose mode, input parameters and
|
|
162
|
+
* output are also shown.
|
|
163
|
+
*
|
|
164
|
+
* @param entries - Entries to format
|
|
165
|
+
* @param options - Formatting options
|
|
166
|
+
* @returns Multi-line formatted log
|
|
167
|
+
*/
|
|
168
|
+
formatLog(entries, options) {
|
|
169
|
+
if (entries.length === 0) {
|
|
170
|
+
return 'No activity entries to display.';
|
|
171
|
+
}
|
|
172
|
+
const verbose = options?.verbose ?? false;
|
|
173
|
+
const lines = [`Activity Log (${entries.length} entries)`, '='.repeat(60), ''];
|
|
174
|
+
for (const entry of entries) {
|
|
175
|
+
const status = entry.result.isError ? '[ERROR]' : '[OK] ';
|
|
176
|
+
const ts = formatTimestamp(entry.timestamp);
|
|
177
|
+
const dur = formatDuration(entry.duration);
|
|
178
|
+
lines.push(`${ts} ${status} ${entry.toolName} (${dur}) [${entry.mode}]`);
|
|
179
|
+
if (verbose) {
|
|
180
|
+
// Show input
|
|
181
|
+
const inputStr = JSON.stringify(entry.toolInput);
|
|
182
|
+
lines.push(` Input: ${truncate(inputStr, 120)}`);
|
|
183
|
+
// Show output
|
|
184
|
+
const outputStr = entry.result.output;
|
|
185
|
+
lines.push(` Output: ${truncate(outputStr, 120)}`);
|
|
186
|
+
if (entry.result.isError) {
|
|
187
|
+
lines.push(` ** Error occurred during execution **`);
|
|
188
|
+
}
|
|
189
|
+
lines.push('');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (!verbose) {
|
|
193
|
+
lines.push('');
|
|
194
|
+
}
|
|
195
|
+
// Append quick stats
|
|
196
|
+
const errorCount = entries.filter(e => e.result.isError).length;
|
|
197
|
+
const totalDuration = entries.reduce((s, e) => s + e.duration, 0);
|
|
198
|
+
const avgDuration = entries.length > 0 ? Math.round(totalDuration / entries.length) : 0;
|
|
199
|
+
lines.push('-'.repeat(60));
|
|
200
|
+
lines.push(`${entries.length} calls, ${errorCount} errors, avg ${formatDuration(avgDuration)}`);
|
|
201
|
+
return lines.join('\n');
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Remove all entries from the activity log.
|
|
205
|
+
*/
|
|
206
|
+
clear() {
|
|
207
|
+
this.entries = [];
|
|
208
|
+
}
|
|
209
|
+
}
|