@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
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compaction Agent
|
|
3
|
-
*
|
|
4
|
-
* Uses a fast LLM model (haiku) to summarize earlier conversation context
|
|
5
|
-
* while preserving key information needed for continuity.
|
|
6
|
-
*
|
|
7
|
-
* The compaction agent is invoked automatically by the context manager
|
|
8
|
-
* when the conversation exceeds the configured threshold, or manually
|
|
9
|
-
* by the user via a `/compact` command in the TUI.
|
|
10
|
-
*
|
|
11
|
-
* Key design decisions:
|
|
12
|
-
* - Uses the cheapest available model (haiku alias) to minimize cost.
|
|
13
|
-
* - Truncates very long tool outputs before sending to the summarizer.
|
|
14
|
-
* - Falls back to a simple extractive summary if the LLM call fails.
|
|
15
|
-
* - Preserves all technical details, file paths, and decisions.
|
|
16
|
-
*
|
|
17
|
-
* @module agent/compaction-agent
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type { LLMRouter } from '../llm/router';
|
|
21
|
-
import { getTextContent, type LLMMessage } from '../llm/types';
|
|
22
|
-
import { ContextManager, estimateTokens, type CompactionResult } from './context-manager';
|
|
23
|
-
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Public Types
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
|
-
/** Options for running compaction. */
|
|
29
|
-
export interface CompactionOptions {
|
|
30
|
-
/** LLM Router instance for making summary calls. */
|
|
31
|
-
router: LLMRouter;
|
|
32
|
-
/** Optional focus area for the summary (e.g. "terraform changes"). */
|
|
33
|
-
focusArea?: string;
|
|
34
|
-
/** Model to use for compaction (default: haiku). */
|
|
35
|
-
model?: string;
|
|
36
|
-
/** H3: Infrastructure context to preserve during compaction. */
|
|
37
|
-
infraContext?: {
|
|
38
|
-
terraformWorkspace?: string;
|
|
39
|
-
kubectlContext?: string;
|
|
40
|
-
awsProfile?: string;
|
|
41
|
-
awsRegion?: string;
|
|
42
|
-
gcpProject?: string;
|
|
43
|
-
azureSubscription?: string;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
// Constants
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
|
|
51
|
-
/** The system prompt given to the compaction model. */
|
|
52
|
-
const COMPACTION_SYSTEM_PROMPT = `You are a conversation summarizer for the Nimbus CLI agent. Your job is to create a concise summary of a conversation between a user and an AI assistant that helps with cloud infrastructure and DevOps tasks.
|
|
53
|
-
|
|
54
|
-
Rules:
|
|
55
|
-
1. Preserve ALL important technical details: file paths, resource names, configuration values, error messages, decisions made.
|
|
56
|
-
2. Preserve the user's original intent and any requirements they specified.
|
|
57
|
-
3. Preserve the current state of any ongoing work (what was done, what remains).
|
|
58
|
-
4. Remove conversational filler, repeated information, and verbose tool outputs.
|
|
59
|
-
5. Use bullet points for clarity.
|
|
60
|
-
6. Keep the summary under 2000 tokens.
|
|
61
|
-
7. Structure the summary as:
|
|
62
|
-
- **User's Goal**: What the user is trying to accomplish
|
|
63
|
-
- **Key Decisions**: Important choices that were made
|
|
64
|
-
- **Work Completed**: What actions were taken and their results
|
|
65
|
-
- **Current State**: Where things stand now
|
|
66
|
-
- **Pending Items**: What still needs to be done (if any)`;
|
|
67
|
-
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// Public API
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Run the compaction agent to summarize a set of messages.
|
|
74
|
-
*
|
|
75
|
-
* Splits the conversation into messages to preserve and messages to
|
|
76
|
-
* summarize (using the context manager's selection logic), sends the
|
|
77
|
-
* latter to a fast LLM for summarization, then reassembles a compacted
|
|
78
|
-
* message array.
|
|
79
|
-
*
|
|
80
|
-
* @param messages - The full conversation message array.
|
|
81
|
-
* @param contextManager - The context manager instance (provides selection logic).
|
|
82
|
-
* @param options - Compaction options (router, model, focus area).
|
|
83
|
-
* @returns The compacted messages and a result summary.
|
|
84
|
-
*/
|
|
85
|
-
export async function runCompaction(
|
|
86
|
-
messages: LLMMessage[],
|
|
87
|
-
contextManager: ContextManager,
|
|
88
|
-
options: CompactionOptions
|
|
89
|
-
): Promise<{ messages: LLMMessage[]; result: CompactionResult }> {
|
|
90
|
-
const { preserved, toSummarize } = contextManager.selectPreservedMessages(messages);
|
|
91
|
-
|
|
92
|
-
// Nothing to summarize -- return early
|
|
93
|
-
if (toSummarize.length === 0) {
|
|
94
|
-
const totalTokens = messages.reduce(
|
|
95
|
-
(sum, m) => sum + estimateTokens(getTextContent(m.content)),
|
|
96
|
-
0
|
|
97
|
-
);
|
|
98
|
-
return {
|
|
99
|
-
messages,
|
|
100
|
-
result: {
|
|
101
|
-
originalTokens: totalTokens,
|
|
102
|
-
compactedTokens: totalTokens,
|
|
103
|
-
savedTokens: 0,
|
|
104
|
-
summaryPreserved: false,
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Format messages for the summarizer
|
|
110
|
-
const conversationText = formatMessagesForSummary(toSummarize);
|
|
111
|
-
const originalTokens = estimateTokens(conversationText);
|
|
112
|
-
|
|
113
|
-
// Build the user prompt for the summarizer
|
|
114
|
-
let userPrompt = `Please summarize the following conversation between a user and the Nimbus AI assistant:\n\n${conversationText}`;
|
|
115
|
-
if (options.focusArea) {
|
|
116
|
-
userPrompt += `\n\nPay special attention to: ${options.focusArea}`;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// H3: Inject current infraContext into compaction prompt so it's never omitted
|
|
120
|
-
if (options.infraContext) {
|
|
121
|
-
const ic = options.infraContext;
|
|
122
|
-
const infraLines: string[] = [];
|
|
123
|
-
if (ic.terraformWorkspace) infraLines.push(`- Terraform workspace: ${ic.terraformWorkspace}`);
|
|
124
|
-
if (ic.kubectlContext) infraLines.push(`- kubectl context: ${ic.kubectlContext}`);
|
|
125
|
-
if (ic.awsProfile) infraLines.push(`- AWS profile: ${ic.awsProfile}`);
|
|
126
|
-
if (ic.awsRegion) infraLines.push(`- AWS region: ${ic.awsRegion}`);
|
|
127
|
-
if (ic.gcpProject) infraLines.push(`- GCP project: ${ic.gcpProject}`);
|
|
128
|
-
if (ic.azureSubscription) infraLines.push(`- Azure subscription: ${ic.azureSubscription}`);
|
|
129
|
-
if (infraLines.length > 0) {
|
|
130
|
-
userPrompt += `\n\n## ALWAYS PRESERVE IN SUMMARY (do not omit):\n${infraLines.join('\n')}`;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Call the LLM for summarization using a fast, cheap model
|
|
135
|
-
const model = options.model ?? 'haiku';
|
|
136
|
-
let summary: string;
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
const response = await options.router.route({
|
|
140
|
-
messages: [
|
|
141
|
-
{ role: 'system', content: COMPACTION_SYSTEM_PROMPT },
|
|
142
|
-
{ role: 'user', content: userPrompt },
|
|
143
|
-
],
|
|
144
|
-
model,
|
|
145
|
-
maxTokens: 2048,
|
|
146
|
-
});
|
|
147
|
-
summary = response.content;
|
|
148
|
-
} catch {
|
|
149
|
-
// If LLM call fails, fall back to a simple extractive summary
|
|
150
|
-
summary = fallbackSummary(toSummarize);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// H3: Prepend infraContext block to summary so it survives compaction
|
|
154
|
-
let finalSummary = summary;
|
|
155
|
-
if (options.infraContext) {
|
|
156
|
-
const ic = options.infraContext;
|
|
157
|
-
const infraLines: string[] = [];
|
|
158
|
-
if (ic.terraformWorkspace) infraLines.push(`- Terraform workspace: ${ic.terraformWorkspace}`);
|
|
159
|
-
if (ic.kubectlContext) infraLines.push(`- kubectl context: ${ic.kubectlContext}`);
|
|
160
|
-
if (ic.awsProfile) infraLines.push(`- AWS profile: ${ic.awsProfile}`);
|
|
161
|
-
if (ic.awsRegion) infraLines.push(`- AWS region: ${ic.awsRegion}`);
|
|
162
|
-
if (ic.gcpProject) infraLines.push(`- GCP project: ${ic.gcpProject}`);
|
|
163
|
-
if (ic.azureSubscription) infraLines.push(`- Azure subscription: ${ic.azureSubscription}`);
|
|
164
|
-
if (infraLines.length > 0) {
|
|
165
|
-
finalSummary = `## Infrastructure Context\n${infraLines.join('\n')}\n\n${summary}`;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
// Reassemble the compacted message array
|
|
169
|
-
const compactedMessages = contextManager.buildCompactedMessages(preserved, finalSummary);
|
|
170
|
-
const compactedTokens = compactedMessages.reduce(
|
|
171
|
-
(sum, m) => sum + estimateTokens(getTextContent(m.content)),
|
|
172
|
-
0
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
messages: compactedMessages,
|
|
177
|
-
result: {
|
|
178
|
-
originalTokens,
|
|
179
|
-
compactedTokens,
|
|
180
|
-
savedTokens: originalTokens - estimateTokens(summary),
|
|
181
|
-
summaryPreserved: true,
|
|
182
|
-
},
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Run manual compaction from a `/compact` command.
|
|
188
|
-
*
|
|
189
|
-
* Creates a temporary context manager with default settings and
|
|
190
|
-
* delegates to {@link runCompaction}.
|
|
191
|
-
*
|
|
192
|
-
* @param messages - The full conversation message array.
|
|
193
|
-
* @param options - Compaction options plus an optional max token override.
|
|
194
|
-
* @returns The compacted messages and a result summary.
|
|
195
|
-
*/
|
|
196
|
-
export async function runManualCompaction(
|
|
197
|
-
messages: LLMMessage[],
|
|
198
|
-
options: CompactionOptions & { maxContextTokens?: number }
|
|
199
|
-
): Promise<{ messages: LLMMessage[]; result: CompactionResult }> {
|
|
200
|
-
const contextManager = new ContextManager({
|
|
201
|
-
maxContextTokens: options.maxContextTokens,
|
|
202
|
-
preserveRecentMessages: 5,
|
|
203
|
-
});
|
|
204
|
-
return runCompaction(messages, contextManager, options);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// ---------------------------------------------------------------------------
|
|
208
|
-
// Internal Helpers
|
|
209
|
-
// ---------------------------------------------------------------------------
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Format messages into a readable conversation transcript.
|
|
213
|
-
*
|
|
214
|
-
* Each message is labelled with its role. Very long tool outputs are
|
|
215
|
-
* truncated to avoid overwhelming the summarizer model. Tool call
|
|
216
|
-
* metadata is included inline for context.
|
|
217
|
-
*/
|
|
218
|
-
function formatMessagesForSummary(messages: LLMMessage[]): string {
|
|
219
|
-
const parts: string[] = [];
|
|
220
|
-
|
|
221
|
-
for (const msg of messages) {
|
|
222
|
-
const role = msg.role === 'user' ? 'User' : msg.role === 'assistant' ? 'Assistant' : 'Tool';
|
|
223
|
-
const content = getTextContent(msg.content);
|
|
224
|
-
|
|
225
|
-
// Truncate very long tool outputs to keep summarizer input manageable
|
|
226
|
-
const truncated = content.length > 2000 ? `${content.slice(0, 2000)}... [truncated]` : content;
|
|
227
|
-
|
|
228
|
-
parts.push(`[${role}]: ${truncated}`);
|
|
229
|
-
|
|
230
|
-
// Include tool call info if present
|
|
231
|
-
if (msg.toolCalls) {
|
|
232
|
-
for (const tc of msg.toolCalls) {
|
|
233
|
-
parts.push(` [Tool Call: ${tc.function.name}(${tc.function.arguments.slice(0, 200)})]`);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return parts.join('\n\n');
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Fallback summary when the LLM is unavailable.
|
|
243
|
-
*
|
|
244
|
-
* Produces a simple extractive summary by listing message counts
|
|
245
|
-
* and the first few user messages. This is better than nothing when
|
|
246
|
-
* the compaction model cannot be reached.
|
|
247
|
-
*/
|
|
248
|
-
function fallbackSummary(messages: LLMMessage[]): string {
|
|
249
|
-
const userMessages = messages.filter(m => m.role === 'user');
|
|
250
|
-
const assistantMessages = messages.filter(m => m.role === 'assistant');
|
|
251
|
-
|
|
252
|
-
const parts: string[] = ['**Conversation Summary (auto-generated)**\n'];
|
|
253
|
-
parts.push(
|
|
254
|
-
`- ${userMessages.length} user messages and ${assistantMessages.length} assistant responses`
|
|
255
|
-
);
|
|
256
|
-
|
|
257
|
-
// Extract key topics from user messages
|
|
258
|
-
for (const msg of userMessages.slice(0, 5)) {
|
|
259
|
-
const content = getTextContent(msg.content);
|
|
260
|
-
if (content.length > 0) {
|
|
261
|
-
parts.push(`- User asked: "${content.slice(0, 150)}${content.length > 150 ? '...' : ''}"`);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return parts.join('\n');
|
|
266
|
-
}
|