@build-astron-co/nimbus 0.4.1 → 0.4.3
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/CHANGELOG.md +268 -89
- package/README.md +26 -567
- package/dist/src/agent/compaction-agent.js +24 -12
- package/dist/src/agent/context-manager.js +2 -1
- package/dist/src/agent/expand-files.js +2 -1
- package/dist/src/agent/loop.js +71 -33
- package/dist/src/agent/permissions.js +4 -2
- package/dist/src/agent/system-prompt.js +34 -17
- package/dist/src/app.js +1 -1
- package/dist/src/auth/keychain.js +8 -4
- package/dist/src/auth/store.js +70 -107
- package/dist/src/cli/init.js +35 -19
- package/dist/src/cli/run.js +18 -10
- package/dist/src/cli/serve.js +4 -2
- package/dist/src/cli.js +52 -11
- package/dist/src/commands/alias.js +5 -3
- package/dist/src/commands/audit/index.js +2 -1
- package/dist/src/commands/aws-terraform.js +36 -18
- package/dist/src/commands/completions.js +1 -1
- package/dist/src/commands/config.js +3 -2
- package/dist/src/commands/connect-github.js +92 -0
- package/dist/src/commands/cost/index.js +3 -2
- package/dist/src/commands/deploy.js +15 -10
- package/dist/src/commands/doctor.js +9 -6
- package/dist/src/commands/drift/index.js +2 -1
- package/dist/src/commands/export.js +5 -3
- package/dist/src/commands/generate-terraform.js +110 -2
- package/dist/src/commands/import.js +3 -3
- package/dist/src/commands/incident.js +10 -5
- package/dist/src/commands/login.js +8 -93
- package/dist/src/commands/logs.js +16 -8
- package/dist/src/commands/onboarding.js +6 -4
- package/dist/src/commands/pipeline.js +6 -3
- package/dist/src/commands/plugin.js +3 -2
- package/dist/src/commands/profile.js +27 -14
- package/dist/src/commands/questionnaire.js +1 -1
- package/dist/src/commands/rollback.js +3 -2
- package/dist/src/commands/rollout.js +5 -3
- package/dist/src/commands/runbook.js +17 -10
- package/dist/src/commands/schedule.js +10 -5
- package/dist/src/commands/status.js +2 -1
- package/dist/src/commands/team-context.js +12 -7
- package/dist/src/commands/template.js +1 -1
- package/dist/src/commands/tf/index.js +6 -3
- package/dist/src/commands/upgrade.js +5 -3
- package/dist/src/commands/version.js +6 -3
- package/dist/src/commands/watch.js +6 -3
- package/dist/src/compat/sqlite.js +5 -3
- package/dist/src/config/mode-store.js +2 -1
- package/dist/src/config/profiles.js +4 -2
- package/dist/src/config/types.js +2 -1
- package/dist/src/engine/executor.js +8 -4
- package/dist/src/engine/planner.js +9 -5
- package/dist/src/llm/providers/anthropic.js +6 -3
- package/dist/src/llm/providers/ollama.js +1 -1
- package/dist/src/llm/router.js +22 -7
- package/dist/src/nimbus.js +1 -0
- package/dist/src/sessions/manager.js +6 -3
- package/dist/src/sharing/viewer.js +2 -1
- package/dist/src/tools/file-ops.js +1 -2
- package/dist/src/tools/schemas/devops.js +197 -108
- package/dist/src/tools/schemas/standard.js +1 -1
- package/dist/src/ui/App.js +25 -13
- package/dist/src/ui/FileDiffModal.js +22 -11
- package/dist/src/ui/HelpModal.js +2 -1
- package/dist/src/ui/InputBox.js +6 -3
- package/dist/src/ui/MessageList.js +40 -20
- package/dist/src/ui/TerminalPane.js +2 -1
- package/dist/src/ui/ToolCallDisplay.js +12 -6
- package/dist/src/ui/TreePane.js +2 -1
- package/dist/src/ui/ink/index.js +37 -21
- package/dist/src/version.js +1 -1
- package/dist/src/watcher/index.js +8 -4
- package/package.json +3 -5
- package/src/__tests__/alias.test.ts +0 -133
- package/src/__tests__/app.test.ts +0 -76
- package/src/__tests__/audit.test.ts +0 -877
- package/src/__tests__/circuit-breaker.test.ts +0 -116
- package/src/__tests__/cli-run.test.ts +0 -351
- package/src/__tests__/compat-sqlite.test.ts +0 -68
- package/src/__tests__/context-manager.test.ts +0 -632
- package/src/__tests__/context.test.ts +0 -242
- package/src/__tests__/devops-terminal-gaps.test.ts +0 -718
- package/src/__tests__/doctor.test.ts +0 -48
- package/src/__tests__/enterprise.test.ts +0 -401
- package/src/__tests__/export.test.ts +0 -236
- package/src/__tests__/gap-11-18-20.test.ts +0 -958
- package/src/__tests__/generator.test.ts +0 -433
- package/src/__tests__/helm-streaming.test.ts +0 -127
- package/src/__tests__/hooks.test.ts +0 -582
- package/src/__tests__/incident.test.ts +0 -179
- package/src/__tests__/init.test.ts +0 -487
- package/src/__tests__/intent-parser.test.ts +0 -229
- package/src/__tests__/llm-router.test.ts +0 -209
- package/src/__tests__/logs.test.ts +0 -107
- package/src/__tests__/loop-errors.test.ts +0 -244
- package/src/__tests__/lsp.test.ts +0 -293
- package/src/__tests__/modes.test.ts +0 -336
- package/src/__tests__/perf-optimizations.test.ts +0 -847
- package/src/__tests__/permissions.test.ts +0 -338
- package/src/__tests__/pipeline.test.ts +0 -50
- package/src/__tests__/polish-phase3.test.ts +0 -340
- package/src/__tests__/profile.test.ts +0 -237
- package/src/__tests__/rollback.test.ts +0 -83
- package/src/__tests__/runbook.test.ts +0 -219
- package/src/__tests__/schedule.test.ts +0 -206
- package/src/__tests__/serve.test.ts +0 -275
- package/src/__tests__/sessions.test.ts +0 -322
- package/src/__tests__/sharing.test.ts +0 -340
- package/src/__tests__/snapshots.test.ts +0 -581
- package/src/__tests__/standalone-migration.test.ts +0 -199
- package/src/__tests__/state-db.test.ts +0 -334
- package/src/__tests__/status.test.ts +0 -158
- package/src/__tests__/stream-with-tools.test.ts +0 -778
- package/src/__tests__/subagents.test.ts +0 -176
- package/src/__tests__/system-prompt.test.ts +0 -248
- package/src/__tests__/terminal-gap-v2.test.ts +0 -395
- package/src/__tests__/terminal-parity.test.ts +0 -393
- package/src/__tests__/tf-apply.test.ts +0 -187
- package/src/__tests__/tool-converter.test.ts +0 -256
- package/src/__tests__/tool-schemas.test.ts +0 -602
- package/src/__tests__/tools.test.ts +0 -144
- package/src/__tests__/version-json.test.ts +0 -184
- package/src/__tests__/version.test.ts +0 -49
- package/src/__tests__/watch.test.ts +0 -129
- package/src/agent/compaction-agent.ts +0 -266
- package/src/agent/context-manager.ts +0 -499
- package/src/agent/context.ts +0 -427
- package/src/agent/deploy-preview.ts +0 -487
- package/src/agent/expand-files.ts +0 -108
- package/src/agent/index.ts +0 -68
- package/src/agent/loop.ts +0 -1998
- package/src/agent/modes.ts +0 -429
- package/src/agent/permissions.ts +0 -513
- package/src/agent/subagents/base.ts +0 -116
- package/src/agent/subagents/cost.ts +0 -51
- package/src/agent/subagents/explore.ts +0 -42
- package/src/agent/subagents/general.ts +0 -54
- package/src/agent/subagents/index.ts +0 -102
- package/src/agent/subagents/infra.ts +0 -59
- package/src/agent/subagents/security.ts +0 -69
- package/src/agent/system-prompt.ts +0 -990
- package/src/app.ts +0 -180
- package/src/audit/activity-log.ts +0 -290
- package/src/audit/compliance-checker.ts +0 -540
- package/src/audit/cost-tracker.ts +0 -318
- package/src/audit/index.ts +0 -23
- package/src/audit/security-scanner.ts +0 -641
- package/src/auth/guard.ts +0 -75
- package/src/auth/index.ts +0 -56
- package/src/auth/keychain.ts +0 -82
- package/src/auth/oauth.ts +0 -465
- package/src/auth/providers.ts +0 -470
- package/src/auth/sso.ts +0 -113
- package/src/auth/store.ts +0 -505
- package/src/auth/types.ts +0 -187
- package/src/build.ts +0 -141
- package/src/cli/index.ts +0 -16
- package/src/cli/init.ts +0 -1227
- package/src/cli/openapi-spec.ts +0 -356
- package/src/cli/run.ts +0 -628
- package/src/cli/serve-auth.ts +0 -80
- package/src/cli/serve.ts +0 -539
- package/src/cli/web.ts +0 -71
- package/src/cli.ts +0 -1728
- package/src/clients/core-engine-client.ts +0 -227
- package/src/clients/enterprise-client.ts +0 -334
- package/src/clients/generator-client.ts +0 -351
- package/src/clients/git-client.ts +0 -627
- package/src/clients/github-client.ts +0 -410
- package/src/clients/helm-client.ts +0 -504
- package/src/clients/index.ts +0 -80
- package/src/clients/k8s-client.ts +0 -497
- package/src/clients/llm-client.ts +0 -161
- package/src/clients/rest-client.ts +0 -130
- package/src/clients/service-discovery.ts +0 -38
- package/src/clients/terraform-client.ts +0 -482
- package/src/clients/tools-client.ts +0 -1843
- package/src/clients/ws-client.ts +0 -115
- package/src/commands/alias.ts +0 -100
- package/src/commands/analyze/index.ts +0 -352
- package/src/commands/apply/helm.ts +0 -473
- package/src/commands/apply/index.ts +0 -213
- package/src/commands/apply/k8s.ts +0 -454
- package/src/commands/apply/terraform.ts +0 -582
- package/src/commands/ask.ts +0 -167
- package/src/commands/audit/index.ts +0 -357
- package/src/commands/auth-cloud.ts +0 -407
- package/src/commands/auth-list.ts +0 -134
- package/src/commands/auth-profile.ts +0 -121
- package/src/commands/auth-refresh.ts +0 -187
- package/src/commands/auth-status.ts +0 -141
- package/src/commands/aws/ec2.ts +0 -501
- package/src/commands/aws/iam.ts +0 -397
- package/src/commands/aws/index.ts +0 -133
- package/src/commands/aws/lambda.ts +0 -396
- package/src/commands/aws/rds.ts +0 -439
- package/src/commands/aws/s3.ts +0 -439
- package/src/commands/aws/vpc.ts +0 -393
- package/src/commands/aws-discover.ts +0 -542
- package/src/commands/aws-terraform.ts +0 -755
- package/src/commands/azure/aks.ts +0 -376
- package/src/commands/azure/functions.ts +0 -253
- package/src/commands/azure/index.ts +0 -116
- package/src/commands/azure/storage.ts +0 -478
- package/src/commands/azure/vm.ts +0 -355
- package/src/commands/billing/index.ts +0 -256
- package/src/commands/chat.ts +0 -320
- package/src/commands/completions.ts +0 -268
- package/src/commands/config.ts +0 -372
- package/src/commands/cost/cloud-cost-estimator.ts +0 -266
- package/src/commands/cost/estimator.ts +0 -79
- package/src/commands/cost/index.ts +0 -810
- package/src/commands/cost/parsers/terraform.ts +0 -273
- package/src/commands/cost/parsers/types.ts +0 -25
- package/src/commands/cost/pricing/aws.ts +0 -544
- package/src/commands/cost/pricing/azure.ts +0 -499
- package/src/commands/cost/pricing/gcp.ts +0 -396
- package/src/commands/cost/pricing/index.ts +0 -40
- package/src/commands/demo.ts +0 -250
- package/src/commands/deploy.ts +0 -260
- package/src/commands/doctor.ts +0 -1386
- package/src/commands/drift/index.ts +0 -787
- package/src/commands/explain.ts +0 -277
- package/src/commands/export.ts +0 -146
- package/src/commands/feedback.ts +0 -389
- package/src/commands/fix.ts +0 -324
- package/src/commands/fs/index.ts +0 -402
- package/src/commands/gcp/compute.ts +0 -325
- package/src/commands/gcp/functions.ts +0 -271
- package/src/commands/gcp/gke.ts +0 -438
- package/src/commands/gcp/iam.ts +0 -344
- package/src/commands/gcp/index.ts +0 -129
- package/src/commands/gcp/storage.ts +0 -284
- package/src/commands/generate-helm.ts +0 -1249
- package/src/commands/generate-k8s.ts +0 -1508
- package/src/commands/generate-terraform.ts +0 -1202
- package/src/commands/gh/index.ts +0 -863
- package/src/commands/git/index.ts +0 -1343
- package/src/commands/helm/index.ts +0 -1126
- package/src/commands/help.ts +0 -715
- package/src/commands/history.ts +0 -149
- package/src/commands/import.ts +0 -868
- package/src/commands/incident.ts +0 -166
- package/src/commands/index.ts +0 -367
- package/src/commands/init.ts +0 -1051
- package/src/commands/k8s/index.ts +0 -1137
- package/src/commands/login.ts +0 -716
- package/src/commands/logout.ts +0 -83
- package/src/commands/logs.ts +0 -167
- package/src/commands/onboarding.ts +0 -405
- package/src/commands/pipeline.ts +0 -186
- package/src/commands/plan/display.ts +0 -279
- package/src/commands/plan/index.ts +0 -599
- package/src/commands/plugin.ts +0 -398
- package/src/commands/preview.ts +0 -452
- package/src/commands/profile.ts +0 -342
- package/src/commands/questionnaire.ts +0 -1172
- package/src/commands/resume.ts +0 -47
- package/src/commands/rollback.ts +0 -315
- package/src/commands/rollout.ts +0 -88
- package/src/commands/runbook.ts +0 -346
- package/src/commands/schedule.ts +0 -236
- package/src/commands/status.ts +0 -252
- package/src/commands/team/index.ts +0 -346
- package/src/commands/team-context.ts +0 -220
- package/src/commands/template.ts +0 -233
- package/src/commands/tf/index.ts +0 -1093
- package/src/commands/upgrade.ts +0 -607
- package/src/commands/usage/index.ts +0 -134
- package/src/commands/version.ts +0 -174
- package/src/commands/watch.ts +0 -153
- package/src/compat/index.ts +0 -2
- package/src/compat/runtime.ts +0 -12
- package/src/compat/sqlite.ts +0 -177
- package/src/config/index.ts +0 -17
- package/src/config/manager.ts +0 -530
- package/src/config/mode-store.ts +0 -62
- package/src/config/profiles.ts +0 -84
- package/src/config/safety-policy.ts +0 -358
- package/src/config/schema.ts +0 -125
- package/src/config/types.ts +0 -609
- package/src/config/workspace-state.ts +0 -53
- package/src/context/context-db.ts +0 -199
- package/src/demo/index.ts +0 -349
- package/src/demo/scenarios/full-journey.ts +0 -229
- package/src/demo/scenarios/getting-started.ts +0 -127
- package/src/demo/scenarios/helm-release.ts +0 -341
- package/src/demo/scenarios/k8s-deployment.ts +0 -194
- package/src/demo/scenarios/terraform-vpc.ts +0 -170
- package/src/demo/types.ts +0 -92
- package/src/engine/cost-estimator.ts +0 -480
- package/src/engine/diagram-generator.ts +0 -256
- package/src/engine/drift-detector.ts +0 -902
- package/src/engine/executor.ts +0 -1066
- package/src/engine/index.ts +0 -76
- package/src/engine/orchestrator.ts +0 -636
- package/src/engine/planner.ts +0 -787
- package/src/engine/safety.ts +0 -743
- package/src/engine/verifier.ts +0 -770
- package/src/enterprise/audit.ts +0 -348
- package/src/enterprise/auth.ts +0 -270
- package/src/enterprise/billing.ts +0 -822
- package/src/enterprise/index.ts +0 -17
- package/src/enterprise/teams.ts +0 -443
- package/src/generator/best-practices.ts +0 -1608
- package/src/generator/helm.ts +0 -630
- package/src/generator/index.ts +0 -37
- package/src/generator/intent-parser.ts +0 -514
- package/src/generator/kubernetes.ts +0 -976
- package/src/generator/terraform.ts +0 -1875
- package/src/history/index.ts +0 -8
- package/src/history/manager.ts +0 -250
- package/src/history/types.ts +0 -34
- package/src/hooks/config.ts +0 -432
- package/src/hooks/engine.ts +0 -392
- package/src/hooks/index.ts +0 -4
- package/src/llm/auth-bridge.ts +0 -198
- package/src/llm/circuit-breaker.ts +0 -140
- package/src/llm/config-loader.ts +0 -201
- package/src/llm/cost-calculator.ts +0 -171
- package/src/llm/index.ts +0 -8
- package/src/llm/model-aliases.ts +0 -115
- package/src/llm/provider-registry.ts +0 -63
- package/src/llm/providers/anthropic.ts +0 -462
- package/src/llm/providers/bedrock.ts +0 -477
- package/src/llm/providers/google.ts +0 -405
- package/src/llm/providers/ollama.ts +0 -767
- package/src/llm/providers/openai-compatible.ts +0 -340
- package/src/llm/providers/openai.ts +0 -328
- package/src/llm/providers/openrouter.ts +0 -338
- package/src/llm/router.ts +0 -1104
- package/src/llm/types.ts +0 -232
- package/src/lsp/client.ts +0 -298
- package/src/lsp/languages.ts +0 -119
- package/src/lsp/manager.ts +0 -294
- package/src/mcp/client.ts +0 -402
- package/src/mcp/index.ts +0 -5
- package/src/mcp/manager.ts +0 -133
- package/src/nimbus.ts +0 -233
- package/src/plugins/index.ts +0 -27
- package/src/plugins/loader.ts +0 -334
- package/src/plugins/manager.ts +0 -376
- package/src/plugins/types.ts +0 -284
- package/src/scanners/cicd-scanner.ts +0 -258
- package/src/scanners/cloud-scanner.ts +0 -466
- package/src/scanners/framework-scanner.ts +0 -469
- package/src/scanners/iac-scanner.ts +0 -388
- package/src/scanners/index.ts +0 -539
- package/src/scanners/language-scanner.ts +0 -276
- package/src/scanners/package-manager-scanner.ts +0 -277
- package/src/scanners/types.ts +0 -172
- package/src/sessions/manager.ts +0 -472
- package/src/sessions/types.ts +0 -44
- package/src/sharing/sync.ts +0 -300
- package/src/sharing/viewer.ts +0 -163
- package/src/snapshots/index.ts +0 -2
- package/src/snapshots/manager.ts +0 -530
- package/src/state/artifacts.ts +0 -147
- package/src/state/audit.ts +0 -137
- package/src/state/billing.ts +0 -240
- package/src/state/checkpoints.ts +0 -117
- package/src/state/config.ts +0 -67
- package/src/state/conversations.ts +0 -14
- package/src/state/credentials.ts +0 -154
- package/src/state/db.ts +0 -58
- package/src/state/index.ts +0 -26
- package/src/state/messages.ts +0 -115
- package/src/state/projects.ts +0 -123
- package/src/state/schema.ts +0 -236
- package/src/state/sessions.ts +0 -147
- package/src/state/teams.ts +0 -200
- package/src/telemetry.ts +0 -108
- package/src/tools/aws-ops.ts +0 -952
- package/src/tools/azure-ops.ts +0 -579
- package/src/tools/file-ops.ts +0 -615
- package/src/tools/gcp-ops.ts +0 -625
- package/src/tools/git-ops.ts +0 -773
- package/src/tools/github-ops.ts +0 -799
- package/src/tools/helm-ops.ts +0 -943
- package/src/tools/index.ts +0 -17
- package/src/tools/k8s-ops.ts +0 -819
- package/src/tools/schemas/converter.ts +0 -184
- package/src/tools/schemas/devops.ts +0 -3502
- package/src/tools/schemas/index.ts +0 -73
- package/src/tools/schemas/standard.ts +0 -1148
- package/src/tools/schemas/types.ts +0 -735
- package/src/tools/spawn-exec.ts +0 -148
- package/src/tools/terraform-ops.ts +0 -862
- package/src/types/ambient.d.ts +0 -193
- package/src/types/config.ts +0 -83
- package/src/types/drift.ts +0 -116
- package/src/types/enterprise.ts +0 -335
- package/src/types/index.ts +0 -20
- package/src/types/plan.ts +0 -44
- package/src/types/request.ts +0 -65
- package/src/types/response.ts +0 -54
- package/src/types/service.ts +0 -51
- package/src/ui/App.tsx +0 -2114
- package/src/ui/DeployPreview.tsx +0 -174
- package/src/ui/FileDiffModal.tsx +0 -162
- package/src/ui/Header.tsx +0 -131
- package/src/ui/HelpModal.tsx +0 -57
- package/src/ui/InputBox.tsx +0 -503
- package/src/ui/MessageList.tsx +0 -1032
- package/src/ui/PermissionPrompt.tsx +0 -163
- package/src/ui/StatusBar.tsx +0 -277
- package/src/ui/TerminalPane.tsx +0 -84
- package/src/ui/ToolCallDisplay.tsx +0 -643
- package/src/ui/TreePane.tsx +0 -132
- package/src/ui/chat-ui.ts +0 -850
- package/src/ui/index.ts +0 -33
- package/src/ui/ink/index.ts +0 -1444
- package/src/ui/streaming.ts +0 -176
- package/src/ui/theme.ts +0 -104
- package/src/ui/types.ts +0 -75
- package/src/utils/analytics.ts +0 -72
- package/src/utils/cost-warning.ts +0 -27
- package/src/utils/env.ts +0 -46
- package/src/utils/errors.ts +0 -69
- package/src/utils/event-bus.ts +0 -38
- package/src/utils/index.ts +0 -24
- package/src/utils/logger.ts +0 -171
- package/src/utils/rate-limiter.ts +0 -121
- package/src/utils/service-auth.ts +0 -49
- package/src/utils/validation.ts +0 -53
- package/src/version.ts +0 -4
- package/src/watcher/index.ts +0 -214
- package/src/wizard/approval.ts +0 -383
- package/src/wizard/index.ts +0 -25
- package/src/wizard/prompts.ts +0 -338
- package/src/wizard/types.ts +0 -172
- package/src/wizard/ui.ts +0 -556
- package/src/wizard/wizard.ts +0 -304
- package/tsconfig.json +0 -24
package/src/ui/streaming.ts
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Streaming Text Display
|
|
3
|
-
*
|
|
4
|
-
* Utilities for displaying streaming LLM responses in the terminal
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { ui } from '../wizard/ui';
|
|
8
|
-
|
|
9
|
-
export interface StreamingDisplayOptions {
|
|
10
|
-
/** Prefix to show before the response (e.g., "Nimbus: ") */
|
|
11
|
-
prefix?: string;
|
|
12
|
-
/** Color for the prefix */
|
|
13
|
-
prefixColor?: string;
|
|
14
|
-
/** Whether to show a cursor while streaming */
|
|
15
|
-
showCursor?: boolean;
|
|
16
|
-
/** Character to use as cursor */
|
|
17
|
-
cursorChar?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* StreamingDisplay handles real-time text output from LLM responses
|
|
22
|
-
*/
|
|
23
|
-
export class StreamingDisplay {
|
|
24
|
-
private options: Required<StreamingDisplayOptions>;
|
|
25
|
-
private buffer: string = '';
|
|
26
|
-
private lineStarted: boolean = false;
|
|
27
|
-
private cursorInterval?: ReturnType<typeof setTimeout>;
|
|
28
|
-
|
|
29
|
-
constructor(options: StreamingDisplayOptions = {}) {
|
|
30
|
-
this.options = {
|
|
31
|
-
prefix: options.prefix || '',
|
|
32
|
-
prefixColor: options.prefixColor || 'blue',
|
|
33
|
-
showCursor: options.showCursor ?? true,
|
|
34
|
-
cursorChar: options.cursorChar || '|',
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Start a new streaming response
|
|
40
|
-
*/
|
|
41
|
-
start(): void {
|
|
42
|
-
this.buffer = '';
|
|
43
|
-
this.lineStarted = false;
|
|
44
|
-
|
|
45
|
-
// Print the prefix
|
|
46
|
-
if (this.options.prefix) {
|
|
47
|
-
ui.write(
|
|
48
|
-
ui.color(this.options.prefix, this.options.prefixColor as Parameters<typeof ui.color>[1])
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
this.lineStarted = true;
|
|
53
|
-
|
|
54
|
-
// Start cursor blink if enabled
|
|
55
|
-
if (this.options.showCursor) {
|
|
56
|
-
this.startCursor();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Append text to the streaming display
|
|
62
|
-
*/
|
|
63
|
-
append(text: string): void {
|
|
64
|
-
// Stop cursor while writing
|
|
65
|
-
this.stopCursor();
|
|
66
|
-
|
|
67
|
-
// Handle newlines in the text
|
|
68
|
-
const lines = text.split('\n');
|
|
69
|
-
|
|
70
|
-
for (let i = 0; i < lines.length; i++) {
|
|
71
|
-
const line = lines[i];
|
|
72
|
-
|
|
73
|
-
if (i > 0) {
|
|
74
|
-
// This is after a newline
|
|
75
|
-
ui.print(''); // End current line
|
|
76
|
-
this.lineStarted = false;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (line) {
|
|
80
|
-
if (!this.lineStarted) {
|
|
81
|
-
// Add indentation for continuation lines
|
|
82
|
-
ui.write(' '); // Indent to align with prefix
|
|
83
|
-
this.lineStarted = true;
|
|
84
|
-
}
|
|
85
|
-
ui.write(line);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
this.buffer += (i > 0 ? '\n' : '') + line;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Restart cursor
|
|
92
|
-
if (this.options.showCursor) {
|
|
93
|
-
this.startCursor();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Complete the streaming display
|
|
99
|
-
*/
|
|
100
|
-
complete(): string {
|
|
101
|
-
this.stopCursor();
|
|
102
|
-
|
|
103
|
-
// Ensure we end on a new line
|
|
104
|
-
if (this.lineStarted) {
|
|
105
|
-
ui.print('');
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return this.buffer;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Handle an error during streaming
|
|
113
|
-
*/
|
|
114
|
-
error(message: string): void {
|
|
115
|
-
this.stopCursor();
|
|
116
|
-
|
|
117
|
-
if (this.lineStarted) {
|
|
118
|
-
ui.print('');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
ui.error(message);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
private startCursor(): void {
|
|
125
|
-
if (this.cursorInterval) {
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
let visible = true;
|
|
130
|
-
this.cursorInterval = setInterval(() => {
|
|
131
|
-
if (visible) {
|
|
132
|
-
ui.write(ui.dim(this.options.cursorChar));
|
|
133
|
-
} else {
|
|
134
|
-
// Backspace to remove cursor
|
|
135
|
-
ui.write('\b \b');
|
|
136
|
-
}
|
|
137
|
-
visible = !visible;
|
|
138
|
-
}, 500);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
private stopCursor(): void {
|
|
142
|
-
if (this.cursorInterval) {
|
|
143
|
-
clearInterval(this.cursorInterval);
|
|
144
|
-
this.cursorInterval = undefined;
|
|
145
|
-
// Clear any remaining cursor character
|
|
146
|
-
ui.write('\b \b');
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Simple streaming helper for one-off usage
|
|
153
|
-
*/
|
|
154
|
-
export async function displayStreaming(
|
|
155
|
-
generator: AsyncGenerator<{ content?: string; type: string }>,
|
|
156
|
-
options: StreamingDisplayOptions = {}
|
|
157
|
-
): Promise<string> {
|
|
158
|
-
const display = new StreamingDisplay(options);
|
|
159
|
-
display.start();
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
for await (const chunk of generator) {
|
|
163
|
-
if (chunk.type === 'content' && chunk.content) {
|
|
164
|
-
display.append(chunk.content);
|
|
165
|
-
} else if (chunk.type === 'error') {
|
|
166
|
-
display.error((chunk as { message?: string }).message || 'Unknown error');
|
|
167
|
-
return '';
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return display.complete();
|
|
172
|
-
} catch (error: unknown) {
|
|
173
|
-
display.error(error instanceof Error ? error.message : 'Streaming failed');
|
|
174
|
-
return '';
|
|
175
|
-
}
|
|
176
|
-
}
|
package/src/ui/theme.ts
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Theme system for Nimbus TUI.
|
|
3
|
-
*
|
|
4
|
-
* Provides named color themes (dark, light) that can be switched at runtime.
|
|
5
|
-
* Components should import `activeTheme` and use its color properties instead
|
|
6
|
-
* of hardcoding color strings.
|
|
7
|
-
*
|
|
8
|
-
* Theme preference is persisted to ~/.nimbus/config.yaml.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import * as fs from 'node:fs';
|
|
12
|
-
import * as path from 'node:path';
|
|
13
|
-
import * as os from 'node:os';
|
|
14
|
-
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// Types
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
|
|
19
|
-
export interface Theme {
|
|
20
|
-
name: string;
|
|
21
|
-
/** Primary accent color (headers, prompts). */
|
|
22
|
-
primary: string;
|
|
23
|
-
/** Secondary accent color (highlights). */
|
|
24
|
-
secondary: string;
|
|
25
|
-
/** Success / create indicator. */
|
|
26
|
-
success: string;
|
|
27
|
-
/** Warning indicator. */
|
|
28
|
-
warning: string;
|
|
29
|
-
/** Error / destroy indicator. */
|
|
30
|
-
error: string;
|
|
31
|
-
/** Dim text and separators. */
|
|
32
|
-
muted: string;
|
|
33
|
-
/** Border color. */
|
|
34
|
-
border: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// Built-in themes
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
|
|
41
|
-
export const THEMES: Record<string, Theme> = {
|
|
42
|
-
dark: {
|
|
43
|
-
name: 'dark',
|
|
44
|
-
primary: 'cyan',
|
|
45
|
-
secondary: 'blue',
|
|
46
|
-
success: 'green',
|
|
47
|
-
warning: 'yellow',
|
|
48
|
-
error: 'red',
|
|
49
|
-
muted: 'gray',
|
|
50
|
-
border: 'gray',
|
|
51
|
-
},
|
|
52
|
-
light: {
|
|
53
|
-
name: 'light',
|
|
54
|
-
primary: 'blue',
|
|
55
|
-
secondary: 'magenta',
|
|
56
|
-
success: 'green',
|
|
57
|
-
warning: 'yellow',
|
|
58
|
-
error: 'red',
|
|
59
|
-
muted: 'gray',
|
|
60
|
-
border: 'white',
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
// Active theme (mutable singleton)
|
|
66
|
-
// ---------------------------------------------------------------------------
|
|
67
|
-
|
|
68
|
-
export let activeTheme: Theme = THEMES.dark;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Switch the active theme by name.
|
|
72
|
-
* Falls back to `dark` if the name is not recognized.
|
|
73
|
-
* Persists the chosen theme name to ~/.nimbus/config.yaml.
|
|
74
|
-
*/
|
|
75
|
-
export function setTheme(name: string): void {
|
|
76
|
-
activeTheme = THEMES[name] ?? THEMES.dark;
|
|
77
|
-
// Persist to config file
|
|
78
|
-
try {
|
|
79
|
-
const configDir = path.join(os.homedir(), '.nimbus');
|
|
80
|
-
const configFile = path.join(configDir, 'config.yaml');
|
|
81
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
82
|
-
let config = '';
|
|
83
|
-
try {
|
|
84
|
-
config = fs.readFileSync(configFile, 'utf-8');
|
|
85
|
-
} catch {
|
|
86
|
-
/* new file */
|
|
87
|
-
}
|
|
88
|
-
if (config.includes('theme:')) {
|
|
89
|
-
config = config.replace(/^theme:.*$/m, `theme: ${name}`);
|
|
90
|
-
} else {
|
|
91
|
-
config = config ? `${config.trim()}\ntheme: ${name}\n` : `theme: ${name}\n`;
|
|
92
|
-
}
|
|
93
|
-
fs.writeFileSync(configFile, config, 'utf-8');
|
|
94
|
-
} catch {
|
|
95
|
-
/* ignore FS errors */
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* List all available theme names.
|
|
101
|
-
*/
|
|
102
|
-
export function listThemes(): string[] {
|
|
103
|
-
return Object.keys(THEMES);
|
|
104
|
-
}
|
package/src/ui/types.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared types for Nimbus TUI components.
|
|
3
|
-
*
|
|
4
|
-
* These interfaces are consumed by every Ink component in the UI layer and by
|
|
5
|
-
* the orchestration logic that feeds data into the rendering tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/** The three operational modes of the Nimbus agent. */
|
|
9
|
-
export type AgentMode = 'plan' | 'build' | 'deploy';
|
|
10
|
-
|
|
11
|
-
/** A single chat message displayed in the message list. */
|
|
12
|
-
export interface UIMessage {
|
|
13
|
-
id: string;
|
|
14
|
-
role: 'user' | 'assistant' | 'system';
|
|
15
|
-
content: string;
|
|
16
|
-
timestamp: Date;
|
|
17
|
-
toolCalls?: UIToolCall[];
|
|
18
|
-
/**
|
|
19
|
-
* Pre-computed content segments (text + code blocks) produced by parseContent().
|
|
20
|
-
* When set, MessageList skips the parsing step for this message entirely.
|
|
21
|
-
* Kept on UIMessage (not LLMMessage) to maintain a clean LLM/UI boundary.
|
|
22
|
-
*/
|
|
23
|
-
_precomputedSegments?: Array<{ type: 'text' | 'code'; content: string; language?: string }>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** A tool invocation attached to an assistant message. */
|
|
27
|
-
export interface UIToolCall {
|
|
28
|
-
id: string;
|
|
29
|
-
name: string;
|
|
30
|
-
input: Record<string, unknown>;
|
|
31
|
-
result?: { output: string; isError: boolean };
|
|
32
|
-
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
33
|
-
/** Elapsed wall-clock time in milliseconds. */
|
|
34
|
-
duration?: number;
|
|
35
|
-
/** Unix timestamp (Date.now()) when the tool call started, for elapsed timer. */
|
|
36
|
-
startTime?: number;
|
|
37
|
-
/** Live stdout/stderr lines streamed during execution (Gap 1). */
|
|
38
|
-
streamingOutput?: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Metadata about the current agent session. */
|
|
42
|
-
export interface SessionInfo {
|
|
43
|
-
id: string;
|
|
44
|
-
model: string;
|
|
45
|
-
mode: AgentMode;
|
|
46
|
-
tokenCount: number;
|
|
47
|
-
maxTokens: number;
|
|
48
|
-
costUSD: number;
|
|
49
|
-
snapshotCount: number;
|
|
50
|
-
/** Active kubectl context (G1). */
|
|
51
|
-
kubectlContext?: string;
|
|
52
|
-
/** Active Terraform workspace (G1). */
|
|
53
|
-
terraformWorkspace?: string;
|
|
54
|
-
/** Infra cost delta string from infracost (G15). */
|
|
55
|
-
infraCostDelta?: string;
|
|
56
|
-
/** LLM connectivity health (GAP-2). */
|
|
57
|
-
llmHealth?: 'checking' | 'ok' | 'error';
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** A single resource-level change shown in the deploy preview. */
|
|
61
|
-
export interface DeployChange {
|
|
62
|
-
action: 'create' | 'modify' | 'destroy' | 'replace';
|
|
63
|
-
resourceType: string;
|
|
64
|
-
resourceName: string;
|
|
65
|
-
details?: string;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** Full deploy preview data rendered before apply. */
|
|
69
|
-
export interface DeployPreviewData {
|
|
70
|
-
tool: string;
|
|
71
|
-
changes: DeployChange[];
|
|
72
|
-
costImpact?: string;
|
|
73
|
-
blastRadius?: string;
|
|
74
|
-
affectedServices?: string[];
|
|
75
|
-
}
|
package/src/utils/analytics.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PostHog Analytics Integration
|
|
3
|
-
*
|
|
4
|
-
* Lightweight analytics wrapper that sends events to PostHog.
|
|
5
|
-
* Operates as a complete no-op when POSTHOG_API_KEY is not set.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export interface AnalyticsEvent {
|
|
9
|
-
event: string;
|
|
10
|
-
properties?: Record<string, unknown>;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class Analytics {
|
|
14
|
-
private apiKey: string | undefined;
|
|
15
|
-
private host: string;
|
|
16
|
-
|
|
17
|
-
constructor() {
|
|
18
|
-
this.apiKey = process.env.POSTHOG_API_KEY;
|
|
19
|
-
this.host = process.env.POSTHOG_HOST || 'https://app.posthog.com';
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
get enabled(): boolean {
|
|
23
|
-
return !!this.apiKey;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async trackEvent(event: string, properties?: Record<string, unknown>): Promise<void> {
|
|
27
|
-
if (!this.enabled) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
await fetch(`${this.host}/capture/`, {
|
|
33
|
-
method: 'POST',
|
|
34
|
-
headers: { 'Content-Type': 'application/json' },
|
|
35
|
-
body: JSON.stringify({
|
|
36
|
-
api_key: this.apiKey,
|
|
37
|
-
event,
|
|
38
|
-
properties: {
|
|
39
|
-
...properties,
|
|
40
|
-
timestamp: new Date().toISOString(),
|
|
41
|
-
},
|
|
42
|
-
distinct_id: properties?.userId || 'anonymous',
|
|
43
|
-
}),
|
|
44
|
-
});
|
|
45
|
-
} catch {
|
|
46
|
-
// Fire-and-forget -- never throw from analytics
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async identifyUser(userId: string, properties?: Record<string, unknown>): Promise<void> {
|
|
51
|
-
if (!this.enabled) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
await fetch(`${this.host}/capture/`, {
|
|
57
|
-
method: 'POST',
|
|
58
|
-
headers: { 'Content-Type': 'application/json' },
|
|
59
|
-
body: JSON.stringify({
|
|
60
|
-
api_key: this.apiKey,
|
|
61
|
-
event: '$identify',
|
|
62
|
-
distinct_id: userId,
|
|
63
|
-
properties,
|
|
64
|
-
}),
|
|
65
|
-
});
|
|
66
|
-
} catch {
|
|
67
|
-
// Fire-and-forget
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export const analytics = new Analytics();
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cost Warning Utility
|
|
3
|
-
*
|
|
4
|
-
* Shows informational cost warnings before destructive operations.
|
|
5
|
-
* Best-effort: silently skips on any failure.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { ui } from '../wizard/ui';
|
|
9
|
-
import { CostEstimator } from '../commands/cost/estimator';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Show an informational cost warning before a destructive operation.
|
|
13
|
-
* Calls CostEstimator.estimateDirectory() and displays the estimated
|
|
14
|
-
* monthly cost impact as a negative value (savings from destroying).
|
|
15
|
-
* Wrapped in try/catch — never throws.
|
|
16
|
-
*/
|
|
17
|
-
export async function showDestructionCostWarning(directory: string): Promise<void> {
|
|
18
|
-
try {
|
|
19
|
-
const estimate = await CostEstimator.estimateDirectory(directory);
|
|
20
|
-
|
|
21
|
-
if (estimate.totalMonthlyCost > 0) {
|
|
22
|
-
ui.warning(`Estimated monthly cost impact: -$${estimate.totalMonthlyCost.toFixed(2)}/month`);
|
|
23
|
-
}
|
|
24
|
-
} catch {
|
|
25
|
-
// Best-effort — silently skip if estimation fails
|
|
26
|
-
}
|
|
27
|
-
}
|
package/src/utils/env.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { ConfigurationError } from './errors';
|
|
2
|
-
|
|
3
|
-
export function getEnv(key: string, defaultValue?: string): string {
|
|
4
|
-
const value = process.env[key];
|
|
5
|
-
if (value === undefined) {
|
|
6
|
-
if (defaultValue !== undefined) {
|
|
7
|
-
return defaultValue;
|
|
8
|
-
}
|
|
9
|
-
throw new ConfigurationError(`Environment variable ${key} is required but not set`, 'nimbus', {
|
|
10
|
-
key,
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
return value;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function getEnvOptional(key: string): string | undefined {
|
|
17
|
-
return process.env[key];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function getEnvNumber(key: string, defaultValue?: number): number {
|
|
21
|
-
const value = process.env[key];
|
|
22
|
-
if (value === undefined) {
|
|
23
|
-
if (defaultValue !== undefined) {
|
|
24
|
-
return defaultValue;
|
|
25
|
-
}
|
|
26
|
-
throw new ConfigurationError(`Environment variable ${key} is required but not set`, 'nimbus', {
|
|
27
|
-
key,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
const parsed = parseInt(value, 10);
|
|
31
|
-
if (isNaN(parsed)) {
|
|
32
|
-
throw new ConfigurationError(`Environment variable ${key} must be a valid number`, 'nimbus', {
|
|
33
|
-
key,
|
|
34
|
-
value,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
return parsed;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {
|
|
41
|
-
const value = process.env[key];
|
|
42
|
-
if (value === undefined) {
|
|
43
|
-
return defaultValue;
|
|
44
|
-
}
|
|
45
|
-
return value.toLowerCase() === 'true' || value === '1';
|
|
46
|
-
}
|
package/src/utils/errors.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
export interface ServiceError {
|
|
2
|
-
code: string;
|
|
3
|
-
message: string;
|
|
4
|
-
service: string;
|
|
5
|
-
timestamp: string;
|
|
6
|
-
details?: unknown;
|
|
7
|
-
stack?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Base Nimbus Error
|
|
12
|
-
*/
|
|
13
|
-
export class NimbusError extends Error {
|
|
14
|
-
code: string;
|
|
15
|
-
service: string;
|
|
16
|
-
timestamp: string;
|
|
17
|
-
details?: unknown;
|
|
18
|
-
|
|
19
|
-
constructor(message: string, code: string, service: string, details?: unknown) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.name = 'NimbusError';
|
|
22
|
-
this.code = code;
|
|
23
|
-
this.service = service;
|
|
24
|
-
this.timestamp = new Date().toISOString();
|
|
25
|
-
this.details = details;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
toJSON(): ServiceError {
|
|
29
|
-
return {
|
|
30
|
-
code: this.code,
|
|
31
|
-
message: this.message,
|
|
32
|
-
service: this.service,
|
|
33
|
-
timestamp: this.timestamp,
|
|
34
|
-
details: this.details,
|
|
35
|
-
stack: this.stack,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export class ValidationError extends NimbusError {
|
|
41
|
-
constructor(message: string, service: string, details?: unknown) {
|
|
42
|
-
super(message, 'VALIDATION_ERROR', service, details);
|
|
43
|
-
this.name = 'ValidationError';
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export class ServiceUnavailableError extends NimbusError {
|
|
48
|
-
constructor(serviceName: string, details?: unknown) {
|
|
49
|
-
super(`Service ${serviceName} is unavailable`, 'SERVICE_UNAVAILABLE', 'nimbus', details);
|
|
50
|
-
this.name = 'ServiceUnavailableError';
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export class TimeoutError extends NimbusError {
|
|
55
|
-
constructor(operation: string, service: string, timeoutMs: number) {
|
|
56
|
-
super(`Operation ${operation} timed out after ${timeoutMs}ms`, 'TIMEOUT_ERROR', service, {
|
|
57
|
-
operation,
|
|
58
|
-
timeoutMs,
|
|
59
|
-
});
|
|
60
|
-
this.name = 'TimeoutError';
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export class ConfigurationError extends NimbusError {
|
|
65
|
-
constructor(message: string, service: string, details?: unknown) {
|
|
66
|
-
super(message, 'CONFIGURATION_ERROR', service, details);
|
|
67
|
-
this.name = 'ConfigurationError';
|
|
68
|
-
}
|
|
69
|
-
}
|
package/src/utils/event-bus.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'node:events';
|
|
2
|
-
|
|
3
|
-
export interface NimbusEvent {
|
|
4
|
-
type: string;
|
|
5
|
-
source: string;
|
|
6
|
-
timestamp: string;
|
|
7
|
-
data: Record<string, unknown>;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type EventHandler = (event: NimbusEvent) => void | Promise<void>;
|
|
11
|
-
|
|
12
|
-
class NimbusEventBus {
|
|
13
|
-
private emitter = new EventEmitter();
|
|
14
|
-
|
|
15
|
-
constructor() {
|
|
16
|
-
this.emitter.setMaxListeners(50);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
publish(event: NimbusEvent): void {
|
|
20
|
-
this.emitter.emit(event.type, event);
|
|
21
|
-
this.emitter.emit('*', event);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
subscribe(eventType: string, handler: EventHandler): () => void {
|
|
25
|
-
this.emitter.on(eventType, handler);
|
|
26
|
-
return () => this.emitter.off(eventType, handler);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
once(eventType: string, handler: EventHandler): void {
|
|
30
|
-
this.emitter.once(eventType, handler);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
removeAllListeners(eventType?: string): void {
|
|
34
|
-
this.emitter.removeAllListeners(eventType);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export const eventBus = new NimbusEventBus();
|
package/src/utils/index.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// Logger
|
|
2
|
-
export { logger, Logger } from './logger';
|
|
3
|
-
export type { LogLevel } from './logger';
|
|
4
|
-
|
|
5
|
-
// Errors
|
|
6
|
-
export * from './errors';
|
|
7
|
-
|
|
8
|
-
// Validation
|
|
9
|
-
export * from './validation';
|
|
10
|
-
|
|
11
|
-
// Environment helpers
|
|
12
|
-
export * from './env';
|
|
13
|
-
|
|
14
|
-
// Service authentication
|
|
15
|
-
export * from './service-auth';
|
|
16
|
-
|
|
17
|
-
// Rate limiting
|
|
18
|
-
export * from './rate-limiter';
|
|
19
|
-
|
|
20
|
-
// Event bus
|
|
21
|
-
export * from './event-bus';
|
|
22
|
-
|
|
23
|
-
// Analytics (PostHog)
|
|
24
|
-
export * from './analytics';
|